SQL 注入是 Web 應用常見漏洞。本文以 DVWA High 級別原始碼為例,說明基本防禦步驟:移除反斜線 + 轉義特殊字元 + 型別檢查。
$id = $_GET['id'];
$id = stripslashes($id);
$id = mysql_real_escape_string($id);
if (is_numeric($id)) {
$getid = "SELECT first_name, last_name FROM users WHERE user_id='$id'";
$result = mysql_query($getid) or die('<pre>'.mysql_error().'</pre>');
$num = mysql_num_rows($result);
}
stripslashes():移除魔術引號自動加入的反斜線(舊版 PHP 相容)mysql_real_escape_string():將特殊字元(如單引號、雙引號、NULL)轉義,防止改變 SQL 語意is_numeric():確認參數為數字,進一步縮小攻擊面上述方式屬於舊式 mysql_* 擴充套件(已移除),現代 PHP 應改用 PDO 或 MySQLi 預處理語句:
// PDO 範例
$stmt = $pdo->prepare("SELECT first_name, last_name FROM users WHERE user_id = ?");
$stmt->execute([$id]);
$rows = $stmt->fetchAll();
// MySQLi 範例
$stmt = $mysqli->prepare("SELECT first_name, last_name FROM users WHERE user_id = ?");
$stmt->bind_param("i", $id);
$stmt->execute();
$result = $stmt->get_result();
本文所述的 stripslashes + mysql_real_escape_string 僅為歷史參考,新專案請務必採用預處理語句。