將 SQL 命令插入 Web 表單/URL/查詢字串,欺騙伺服器執行惡意 SQL。
永不信任使用者輸入,所有輸入視為不安全,必須過濾驗證。
// 用戶名:字母數字下劃線,8-20 字元
if (preg_match("/^\w{8,20}$/", $_GET['username'], $matches)) {
$result = mysql_query("SELECT * FROM users WHERE username=$matches[0]");
} else {
echo "username 輸入異常";
}
$name = "Qadir'; DELETE FROM users;";
mysql_query("SELECT * FROM users WHERE name='{$name}'");
// 若無過濾,將執行 DELETE FROM users
注意: PHP mysql_query() 單次執行一條 SQL,但 SQLite/PostgreSQL 支援多條,風險更高。
if (get_magic_quotes_gpc()) {
$name = stripslashes($name);
}
$name = mysql_real_escape_string($name);
mysql_query("SELECT * FROM users WHERE name='{$name}'");
$sub = addcslashes(mysql_real_escape_string("%something_"), "%_");
// $sub == \%something\_
mysql_query("SELECT * FROM messages WHERE subject LIKE '{$sub}%'");
addcslashes() 在指定字元(%、_)前加反斜線,防止萬用字元被濫用。
SQL 注入防禦核心:**參數化查詢 + 最小權限 + 輸入驗證 + 錯誤隱藏**。無單一銀彈,需纵深防禦體系。語言/框架無關,原理通用。