SQL インジェクション (SQLi) は、悪意のある SQL ステートメントを実行できるインジェクション攻撃です。攻撃者はデータベース クエリに任意の SQL コードを挿入することで、Web アプリケーションの背後にあるデータベース サーバーを完全に制御できるようになります。
攻撃者は、SQL インジェクションの脆弱性を利用してアプリケーションのセキュリティ対策をバイパスし、Web ページまたは Web アプリケーションの認証と認可をバイパスし、SQL データベース全体のコンテンツを取得することができます。 ; SQL インジェクションは、データベース内のレコードの追加、変更、削除にも使用できます。
PHP での SQL インジェクションを防ぐにはどうすればよいですか?
1. SQL インジェクション攻撃に対して最も脆弱になるのはどんなときですか?
アプリケーションが入力コンテンツを使用して動的 SQL ステートメントを構築し、データベース SQL インジェクション攻撃が発生します
2. SQL インジェクションを防ぐ方法
a.ユーザー入力を決して信頼せず、ユーザー入力を検証してください。正規表現を使用するか、一重引用符と「_」を変換する長さを制限してください。
非推奨:
//$user = htmlspecialchars(addslashes($user)); //$pwd = htmlspecialchars(addslashes($pwd)); //$yzm = htmlspecialchars(addslashes($yzm));
使用する必要があります:
$user = htmlspecialchars(addslashes($user)); $pwd = htmlspecialchars(addslashes($pwd)); $yzm = htmlspecialchars(addslashes($yzm));
b, SQL の動的アセンブリは絶対に使用しないでください。パラメータ化された SQL を使用するか、データ クエリとアクセスにストアド プロシージャを直接使用できます。
推奨されません:
// $sql = "select * from user where user='$user' and pwd ='$pwd'";
使用する必要があります:
$sql = "select * from user where user=? and pwd =?";
c, 管理者権限を持つデータベース接続は決して使用しないでください。アプリケーションごとに制限されたアクセス許可を持つ別のデータ接続を使用してください。
$conn = @new mysqli('localhost','root','','myschool'); if($conn->connect_error){ die('连接数据库失败'); } $conn->set_charset('utf8');
d, 機密情報を直接保存しないでください。 、パスワードと機密情報を暗号化または HASH します
e、QL インジェクションの検出方法は、通常、補助ソフトウェアまたは Web サイト プラットフォーム検出を使用します。ソフトウェア 通常、SQL インジェクション検出ツール jsky が使用されます。 . Web サイト プラットフォームには Yisi があります。Web サイト プラットフォーム検出ツール
3 と php mysqli 拡張機能の前処理
は、mysqli 操作でよく使用されます。その 3 つの主要なクラスが含まれます: MYSQLIクラス、MYSQL_STMT クラス、MYSQLI_RESULT クラス、前処理は主に MYSQL_STMT クラスを使用して完了します。
前処理は SQL インジェクションを防ぐ重要な手段であり、Web サイトのセキュリティを向上させる上で非常に重要です。前処理ステートメントの動作原理:
(1) 前処理: Create SQL ステートメント テンプレートを作成し、それをデータベースに送信します。予約された値はパラメータでマークされていますか?
例: myguests(firstname,lastname,email) 値に挿入 (?,?,?)
(2) データベース分析、コンパイル、SQL ステートメント テンプレートのクエリ最適化、およびstorage 結果は出力されません
if ($stmt = $conn->prepare($sql)) { $stmt -> bind_param("ss",$user,$pwd); $stmt -> execute(); $stmt -> store_result(); //$res = $conn ->query($sql); if ($stmt->num_rows==0) { show_error('输入的用户名或密码错误','demo1.html'); } $stmt -> close(); } $conn ->close();
(3) 実行 最後にアプリケーションがバインドした値をパラメータ(?マーク)に渡します データベースがステートメントを実行します アプリケーションはステートメントを実行できます
PHP 関連の詳細については、PHP 中国語 Web サイトをご覧ください。
以上がPHPでのSQLインジェクションを防ぐにはどうすればよいですか?の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。