PHP:使用预处理语句注入保护(PHP: Injection protection using pr

2019-10-18 09:41发布

我熟悉使用PHP来执行MySQL的查询。 不过,我一直在使用REG EXPS作为对注入攻击的保护。 上所以这里读书的几个问题/答案之后,我决定选择准备好的语句来代替。

有两种选择(让我知道如果有更多):

  1. mysqli的准备语句
  2. PDO准备staments

问题1

我想了解的链接页面给出的示例代码。

对于mysqli的 ,实施例#1:

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

什么是"s"参数吗?
如果我需要超过1个paramater,我该怎么办呢?

对于PDO,实施例#1:

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

什么是目的PDO::ATTR_CURSORPDO::CURSOR_FWDONLY这里?

问题2

哪一个,库MySQLi或PDO,你会建议? 利弊?

Answer 1:

问题1

s参数结合“:”任何值$城市都有。 所以如果你的SQL是“ SELECT District FROM City WHERE Name = s ”,你执行的查询是“ SELECT District FROM City Where Name = $city ”。

要结合更多的参数,只需要调用bindParam每个参数。 您还可以传递一个数组PDOStatement对象::执行。

问题2

由于我使用了一些不同的数据库(MySQL和sqllite)我喜欢与PDO工作。 在这个问题上脱颖而出的更多信息,请参阅的mysqli或PDO -什么利弊? 。



Answer 2:

s表明$city预计将是一个字符串

PDO::ATTR_CURSOR部分的设定要传递到PDO的名字。 值PDO::CURSOR_FWDONLY (这是默认的,所以你不需要指定IF)意味着每叫你做PDOStatement::fetch()您将获得在结果集中的下一行。 替代的办法是PDO::CURSOR_SCROLL -但除非你明确知道你需要这个(和你的数据库支持的话)你应该保留默认值。



文章来源: PHP: Injection protection using prepared statements