db_insert安全吗?


15

我正在使用Drupal 7方法db_insert,将数据插入Drupal数据库的自定义表中。我读过,这是首选的方法,但是我遍历了代码和doco,并且看不到任何解析值的地方,或者告诉我这些值是安全的。

一些值来自用户,因此我需要检查SQL注入攻击。

这是我正在阅读的示例,其中Drupal 6解析值,而Drupal 7版本不解析值。

<?php
// Drupal 6 version
db_query('INSERT INTO {vchess_games} 
   (gid, timestamps, white, black, state, board_white, board_black) ' . "VALUES ('%s', '%s', '%s', '%s', '%s', '%s', '%s')", 
   $gid, $timestamps, $game['white'], $game['black'], $state, $board_white, $board_black);

// Drupal 7 version
db_insert('vchess_games')
  ->fields(array(
    'gid' => $gid,
    'timestamps' => $timestamps,
    'white' => $game['white'],
    'black' => $game['black'],
    'state' => $state,
    'board_white' => $board_white,
    'board_black' => $board_black
  ))
  ->execute();
?>

Answers:


13

Drupal数据库层环绕PDO并使用准备好的语句,因此,是的,可以对insert语句进行清理并保护其免受SQL注入攻击。

Prepared Statements”文档中的这句话最能说明这一点:

准备好的语句的参数不需要用引号引起来;驱动程序会自动处理。如果应用程序仅使用准备好的语句,则开发人员可以确保不会发生SQL注入(但是,如果使用未转义的输入来构建查询的其他部分,则仍然可以进行SQL注入)。

这同样适用于所有的在Drupal 7(数据库函数真db_selectdb_delete等)。唯一仍然可能不安全的是db_query()它将执行传递给它的任何任意字符串。即使使用db_query(),您也可以传入参数,因此查询是安全的。

数据库抽象层的文档有一些更多的信息。

By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.