在MySQL中使用预处理语句是否可以防止SQL注入攻击?

时间:2012-06-16 04:15:34

标签: php mysql pdo sql-injection

我想验证在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(); 
}

2 个答案:

答案 0 :(得分:7)

准备好的查询通过分离要运行的查询以及要用于该查询的数据来防止攻击。这意味着不能发生一阶攻击,因为您没有直接将数据连接到查询中。

简而言之,如果您总是使用准备好的查询,并且所有数据都是使用绑定参数(包括来自其他查询的数据)发送的,那么就SQL注入而言,您没问题。

(我还应该注意,一些不支持准备好的查询的服务器的PDO驱动程序会使用传统的转义程序伪造它。不要担心这个。这很安全。)

答案 1 :(得分:3)

是的,根据php文档,使用预准备语句将阻止SQL注入。

请参阅Link