4

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

2 回答 2

7

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

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

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

于 2012-06-16T04:21:24.447 回答
3

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

链接

于 2012-06-16T04:19:13.920 回答