PHP:使用预准备语句的注入保护

时间:2009-11-23 11:45:39

标签: php pdo mysqli prepared-statement

我熟悉使用PHP来执行mySQL查询。但是,我一直使用reg exps来防止注入攻击。在SO上阅读了几个问题/答案后,我决定选择准备好的陈述。

有两种选择(如果还有更多,请告诉我):

  1. mysqli prepared statements
  2. PDO prepared staments
  3. 问题1

    我正在尝试理解链接页面上给出的代码示例。

    对于 mysqli ,示例#1:

    if ($stmt = $mysqli->prepare("SELECT District FROM City WHERE Name=?")) {
        $stmt->bind_param("s", $city);
    

    "s"参数有什么作用?
    如果我需要超过1个参数,我该怎么做?

    对于 PDO ,示例#1:

    $sth = $dbh->prepare($sql, array(PDO::ATTR_CURSOR => PDO::CURSOR_FWDONLY));
    

    此处PDO::ATTR_CURSORPDO::CURSOR_FWDONLY的目的是什么?

    问题2

    你会推荐哪一个,mysqli或PDO?优点和缺点?

2 个答案:

答案 0 :(得分:7)

s表示$city应为字符串

PDO::ATTR_CURSOR部分是您传递给PDO的设置的名称。值PDO::CURSOR_FWDONLY(这是默认值,因此您无需指定if)表示对PDOStatement::fetch()进行的每次调用都会给出结果集中的下一行。替代选项是PDO::CURSOR_SCROLL - 但除非您明确知道需要这个(并且您的数据库支持它),否则应将其保留为默认值。

答案 1 :(得分:2)

问题1

s参数将“:”绑定到$ city所具有的任何值。因此,如果您的sql为“SELECT District FROM City WHERE Name = s”,则您执行的查询将为“SELECT District FROM City Where Name = $city”。

要绑定更多参数,只需为每个参数调用bindParam即可。您还可以将数组传递给PDOStatement :: execute。

问题2

由于我使用了一些不同的数据库(mysql和sqllite),我更喜欢使用PDO。有关此主题的更多信息,请参阅mysqli or PDO - what are the pros and cons?