PHP:使用预准备语句进行注入保护
我熟悉使用PHP来执行mySQL查询。 但是,我一直在使用reg exps来防止注入攻击。 在阅读了关于SO的几个问题/答案之后,我决定选择准备好的陈述。
有两个选项可用(让我知道如果有更多):
问题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_CURSOR
和PDO::CURSOR_FWDONLY
的目的是什么?
问题2
哪一个,mysqli或PDO,你会推荐? 优点和缺点?
问题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或PDO - 有哪些优缺点?
在s
表明$city
预计将是一个字符串
PDO::ATTR_CURSOR
部分是您传递给PDO的设置的名称。 值PDO::CURSOR_FWDONLY
(这是默认值,因此您不需要指定if)意味着对于您对PDOStatement::fetch()
所做的每个调用,您将获得结果集中的下一行。 另一种选择是PDO::CURSOR_SCROLL
- 但除非你明确知道你需要这个(并且你的数据库支持它),否则你应该把它保持默认。