【问题标题】:PDO When do i need to parametire my queries?PDO 我什么时候需要参数化我的查询?
【发布时间】:2012-07-30 16:02:54
【问题描述】:

所以我正在使用 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) 验证并仍然参数化。

*即时查询

【问题讨论】:

    标签: php pdo prepared-statement sql-injection


    【解决方案1】:

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

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

    【讨论】:

    • 只是为了确保,在所有条款中。选择,在哪里,分组等等,因为“井”类型的字符串总是可以在整个查询中注入代码?这会使代码变大很多倍吗?
    • 考虑一个查询序列,您从一个表中获取一个人的姓名,然后在其他查询中使用它。如果那个人是Miles O'Brien,那么您现在将在其他查询中注入报价并破坏它们。很快就会有小Bobby Tables 注册您的系统。使用参数,无论数据中有多少可注入的东西,这个问题都会消失。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2010-09-21
    • 2018-02-25
    • 1970-01-01
    • 1970-01-01
    • 2010-10-15
    • 2015-04-06
    • 2019-07-17
    相关资源
    最近更新 更多