ホームページ >バックエンド開発 >PHPチュートリアル >SQLインジェクションの脆弱性とその防止策について詳しく解説
SQL インジェクションの原理: SQL コードの一部を元の SQL ステートメントに追加し、特別な SQL ステートメントを構築し、プログラム独自の権限を使用して必要な操作を実装します。
現在ユーザーテーブルがあるとします:
uidusernamepwd
1adminadmin222
2custome123456
次にログイン操作を実行します:
<?php $conn=mysqli_connect("localhost","root","root","test"); // 连接数据库test if (!$conn) { # code...判断链接是否成功 echo "连接失败!"; echo mysqli_connect_error(); exit(); } mysqli_query($conn,"set names utf8"); // 指定编码格式 $user = $_GET['user']; $pwd = $_GET['pwd']; $sql="select * from user where username = '{$user}' and pwd = '{$pwd}'"; // sql语句 $result=mysqli_query($conn,$sql); // 执行sql语句,将执行结果返回到结果集中 $row=mysqli_fetch_array($result); // 从结果集中取得一行作为数组 echo "<pre class="brush:php;toolbar:false">"; print_r($row); ?>
上記のコードは単純なログイン操作を実行します。ブラウザプログラム: localhost/test/login.php?user=admin&pwd=admin222 の場合、実行される SQL 文は select * from user where username= 'admin' and pwd = 'admin222' となり、実行結果が得られます。
localhost/test/login.php?user=admin&pwd=admin をリクエストした場合、パスワードがユーザー名と一致しないため、クエリ結果はありません。つまり、SQL ステートメント: select * from user where username= 'admin' and pwd = 'admin' の結果が見つかりません。次に、それが SQL ステートメントの場合: select * username = 'admin' および pwd = 'admin' または 1 = 1 のユーザーから;?自分で試すことができ、次の情報を取得できます:
uidusernamepwd
1adminadmin222
2custome123456
クライアントで localhost/test/login.php?user=admin&pwd=admin%20or%201=1 にアクセスするとどうなるでしょうか。 ?
私は検証を直接バイパスし、データベース内の管理者ユーザー情報を取得しました。これは単純な SQL インジェクションです。
SQL インジェクションの防止:
(1) 整変数の場合は、intval() 関数または (int) を使用して、すべての受信パラメーターを数値に変換します。
(2) 文字変数の場合、addslashes() を使用して、すべての ' (一重引用符)、" (二重引用符)、(バックスラッシュ)、および (スペース) をバックスラッシュを含む文字に変換します。
(3 ) エスケープするか、特殊なフィルターを適用します。 % などの文字。
(4) データのバックアップを作成します。
関連する推奨事項:
デシリアライゼーションオブジェクトインジェクションの脆弱性について
php は SQL インジェクションの脆弱性を防止します。コード
以上がSQLインジェクションの脆弱性とその防止策について詳しく解説の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。