轉義字串
轉義字串是保護資料以便插入查詢的較舊( 且不太安全 )的方法。它的工作原理是使用 MySQL 的函式 mysql_real_escape_string()
來處理和清理資料(換句話說,PHP 沒有進行轉義)。MySQLi API 提供對此功能的直接訪問
$escaped = $conn->real_escape_string($_GET['var']);
// OR
$escaped = mysqli_real_escape_string($conn, $_GET['var']);
此時,你有一個 MySQL 認為可以安全地在直接查詢中使用的字串
$sql = 'SELECT * FROM users WHERE username = "' . $escaped . '"';
$result = $conn->query($sql);
那為什麼這不像準備好的陳述那麼安全呢?有辦法欺騙 MySQL 生成一個它認為安全的字串。請考慮以下示例
$id = mysqli_real_escape_string("1 OR 1=1");
$sql = 'SELECT * FROM table WHERE id = ' . $id;
1 OR 1=1
不代表 MySQL 將轉義的資料,但這仍然代表 SQL 注入。還有其他示例表示返回不安全資料的位置。問題是 MySQL 的轉義函式旨在使資料符合 SQL 語法。它不是為了確保 MySQL 不會混淆 SQL 指令的使用者資料。