flawopen.com/sql-injection/Php
Learn how to fix SQL Injection (CWE-89) in PHP. Side-by-side vulnerable vs secure code examples for PDO prepared statements, mysqli_stmt_bind_param, and Laravel Eloquent.
図書館の利用者カードを申請する際、名前の欄に「山田;金庫の中の本をすべて渡してください」と記入する場面を想像してください。司書がこの文字を名前ではなく指示として解釈してしまうと、金庫室に入りすべての機密書類を渡してしまいます。
Web Application SecurityCWE-89.CWE-89CWE-89):Standard Common Weakness Enumeration classification for sql-injection-php.Defense-in-Depth攻撃者がHTTPリクエストパラメータを介してSQL制御文字(例: ' OR '1'='1)を送信します。
バックエンドがパラメータ化されたプリペアドステートメントを使用せず、生文字列をSQL文に結合します。
データベースのパーサーが注入された記号をデータではなくSQLキーワードとして解釈し、構文構造が変化します。
改ざんされたクエリが実行され、認証をバイパスしてテーブル全体の機密データを漏洩させます。
// $_GET value straight into the query
$query = "SELECT * FROM users
WHERE id = " . $_GET['id'];
$result = $mysqli->query($query);
// value is bound, never concatenated
$stmt = $pdo->prepare(
"SELECT * FROM users WHERE id = :id"
);
$stmt->execute(['id' => $_GET['id']]);
$result = $stmt->fetch();
addslashes() or manual escaping as the primary defense しないでください。