我想验证在MySQL中使用预准备语句是否会阻止SQL注入。
以下代码是否会阻止所有SQL注入攻击?
$var = $_GET['q'];
$trimmed = trim($var);
if ($trimmed != NULL) {
$get_fighters = $DBH->prepare(
'SELECT *
FROM fighters
WHERE name LIKE :searchTerm
OR nickname LIKE :searchTerm
OR born_in_city LIKE :searchTerm
OR born_in_state LIKE :searchTerm
OR born_in_country LIKE :searchTerm
ORDER BY name ASC');
$get_fighters->bindValue(':searchTerm', '%' . $trimmed . '%', PDO::PARAM_STR);
$get_fighters->setFetchMode(PDO::FETCH_ASSOC);
$get_fighters->execute();
$check_results_fighters = $get_fighters->rowCount();
$get_events = $DBH->prepare(
'SELECT *
FROM events
WHERE event_name LIKE :searchTerm
OR event_arena LIKE :searchTerm
OR event_city LIKE :searchTerm
OR event_state LIKE :searchTerm
OR event_country LIKE :searchTerm
OR organization LIKE :searchTerm
ORDER BY event_date DESC');
$get_events->bindValue(':searchTerm', '%' . $trimmed . '%', PDO::PARAM_STR);
$get_events->setFetchMode(PDO::FETCH_ASSOC);
$get_events->execute();
$check_results_events = $get_events->rowCount();
}
答案 0 :(得分:7)
准备好的查询通过分离要运行的查询以及要用于该查询的数据来防止攻击。这意味着不能发生一阶攻击,因为您没有直接将数据连接到查询中。
简而言之,如果您总是使用准备好的查询,并且所有数据都是使用绑定参数(包括来自其他查询的数据)发送的,那么就SQL注入而言,您没问题。
(我还应该注意,一些不支持准备好的查询的服务器的PDO驱动程序会使用传统的转义程序伪造它。不要担心这个。这很安全。)
答案 1 :(得分:3)
是的,根据php文档,使用预准备语句将阻止SQL注入。
请参阅Link