攻擊者利用未過濾的用戶輸入,拼接惡意 SQL 片段,竊取、篡改或刪除數據庫數據。典型案例:
<?php
$q = "SELECT id FROM users WHERE username='". $_GET['username'] ."' AND password='". $_GET['password'] ."'";
?>
輸入 ' ; SHOW TABLES; -- 即可列出所有表;輸入 '; DROP TABLE users; -- 可刪除表。
<?php
$stmt = $pdo->prepare("SELECT id FROM users WHERE username=? AND password=?");
$stmt->execute([$_POST['username'], $_POST['password']]);
PDO 或 MySQLi 預處理徹底分離代碼與數據,從根源杜絕注入。
mysqli_real_escape_string():轉義特殊字符。intval()、(int):強制數值類型。<?php
$username = mysqli_real_escape_string($link, $_GET['username']);
$password = mysqli_real_escape_string($link, $_GET['password']);
$q = "SELECT id FROM users WHERE username='$username' AND password='$password'";
「預處理語句 + 最小權限 + 輸入驗證」是防禦 SQL 注入的鐵三角。切勿僅依賴單一手段,分層防護才能構建安全防線。