【问题标题】:SQL Injection with Prepared Statements使用准备好的语句进行 SQL 注入
【发布时间】:2014-04-25 06:39:06
【问题描述】:

假设,使用 PHP 和 MySQL,我准备了以下 SQL 语句:

$statement = $connection->prepare("SELECT departmentName FROM departments WHERE department_type='academic' AND buildingName=?")

-- 其中 buildingName 是 URL 的查询字符串传入的参数(经过验证并绑定),department_type 是已知参数。

这种预处理语句是否仍然容易受到 SQL 注入或任何其他 SQL 攻击?具体来说,是否将明确的参数(在这种情况下为 department_type)直接放入准备好的语句的命令字符串中是否可能存在漏洞?

【问题讨论】:

    标签: php mysql security sql-injection


    【解决方案1】:

    不,它不会脆弱。建议使用准备好的语句来防止 SQLi。

    如果您确定department_type 参数不受任何用户输入的影响,那么将其直接放入查询中是安全的。

    虽然变量受到用户输入的影响有点复杂。这种影响也可以是间接的。例如,如果从数据库中检索到department_type,它保存在另一个受用户影响的页面上,那么它会间接受到用户输入的影响,应该被视为“不可信”。

    【讨论】:

      【解决方案2】:

      清理输入(有时甚至是输出)是一种很好的做法,因为它可能会破坏应用程序的其他部分。如果您使用准备好的语句,您的数据库不会受到影响,但如果您正在提供网页,它可能会受到攻击的影响。

      作为可能的攻击类型的示例,您可以查看XSS attacks。它目前在 owasp 网站中被列为第三大最常用的攻击类型。

      【讨论】:

        【解决方案3】:

        直接在查询中使用 department_type 是安全的,因为 department_type='academic' 是常量且不能更改。

        希望这些链接对您有所帮助。

        How does PHP PDO's prepared statements prevent sql injection?

        【讨论】:

        • 只有链接的答案应该是评论
        猜你喜欢
        • 2010-12-19
        • 2014-10-14
        • 1970-01-01
        • 2013-04-16
        • 1970-01-01
        • 1970-01-01
        • 2016-03-07
        • 2012-01-05
        • 2012-07-12
        相关资源
        最近更新 更多