防止 SQL 注入的最佳方法是使用当前技术。MySQLmysql_
系列函数已被弃用,并将在未来的修订版中从 PHP 中删除。
您应该将准备好的语句与 MySQLi 或 PDO 一起使用。
这些技术使用准备好的语句和参数化查询。SQL 语句由数据库服务器与任何参数分开解析。攻击者不可能注入恶意 SQL。
你基本上有两种选择来实现这一点:
MySQLi:
$stmt = $dbConnection->prepare('SELECT * FROM table WHERE name = ?');
$stmt->bind_param('s', $name);
$stmt->execute();
$result = $stmt->get_result();
while ($row = $result->fetch_assoc()) {
// do something with $row
}
PDO:
$stmt = $pdo->prepare('SELECT * FROM table WHERE name = :name');
$stmt->execute(array(':name' => $name));
foreach ($stmt as $row) {
// do something with $row
}
发生的情况是您传递给的 SQL 语句prepare
由数据库服务器解析和编译。通过指定参数(a?
或命名参数,如:name
),您可以告诉数据库引擎您要过滤的内容。然后,当您调用execute
准备好的语句时,将与您指定的参数值相结合。
这里重要的是参数值与编译语句组合在一起,而不是 SQL 字符串。SQL 注入的工作原理是在创建要发送到数据库的 SQL 时诱使脚本包含恶意字符串。因此,通过将实际 SQL 与参数分开发送,您可以限制以您不想要的东西结束的风险。您在使用准备好的语句时发送的任何参数都将被视为字符串(尽管数据库引擎可能会进行一些优化,因此参数也可能最终以数字形式结束)。