PDO我什么时候需要参数化我的查询


PDO When do i need to parametire my queries?

所以我使用PDO来尝试安全地防止SQL注入。

我的问题是,在使用数据库信息之前,我应该检查/验证它吗?

例如:

$stmt = $pdo -> prepare(SELECT userID FROM user, comment WHERE userNumber ='1' AND user.userName = comment.UserName");

我想我的选择是:

1) 在将所有输入插入数据库之前,我会验证所有输入,这样我就不必检查user.userName是否是可以注入代码的字符串。

2) 我应该参数化我从数据库中获得的数据。还不确定,但类似于:

$stmt->bindValue(':comment.UserName', comment.UserName, PDO::PARAM_STR); 

3) 同时验证并仍然参数化。

*在飞行中进行的查询

规则很简单:ALWAYS参数化查询。即使这些查询从未在网页上使用过,并且面临恶意用户群,ANYTIME如果您在查询字符串中使用外部数据,甚至是来自数据库的数据,您也可以STILL自行注入。

唯一的例外是参数查询不起作用的时候,例如任意长度的WHERE IN (...)值列表、动态表/字段名称(无论如何,这通常都是个坏主意)。在这些有限的情况下,您可以自己构建查询,但必须采取适当的注入攻击缓解过程。