转义字符串

转义字符串是保护数据以便插入查询的较旧( 且不太安全 )的方法。它的工作原理是使用 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 指令的用户数据