用戶構造 URL:`test.php?sql=values%27);%20DROP%20DATABASE%20test;%20--%20`
PHP 代碼:
$data = $_GET['sql'];
$sql = "INSERT INTO test (test) VALUES ('$data');";
mysql_query($sql); // 單條語句執行接口
期望注入 `DROP DATABASE test`,實際報錯:`You have an error in your SQL syntax... near 'DROP DATABASE test; -- ')'`。
// mysqli 多語句 (危險,需極度小心)
mysqli_multi_query($conn, "INSERT ...; DROP DATABASE test; --");
// PDO 多語句 (默認禁用,需設置屬性)
$pdo->setAttribute(PDO::ATTR_EMULATE_PREPARES, false); // 使用真實預處理
$pdo->exec("INSERT ...; DROP DATABASE test;"); // 仍可能被驅動層攔截
// mysqli 預處理 (推薦)
$stmt = $mysqli->prepare("INSERT INTO test (test) VALUES (?)");
$stmt->bind_param("s", $data); // 參數綁定,徹底隔離代碼與數據
$stmt->execute();
// PDO 預處理 (推薦)
$stmt = $pdo->prepare("INSERT INTO test (test) VALUES (?)");
$stmt->execute([$data]);