【问题标题】:PDO execute($input_parameter) protects from sql injections as bindParam/bindValue?PDO 执行($input_parameter)作为 bindParam/bindValue 防止 sql 注入?
【发布时间】:2012-09-05 02:41:18
【问题描述】:

execute($input_parameter) 是否像 bindParam/bindValue 一样防止 sql 注入?

如果答案是肯定的,bindParam()/bindValue()/execute() 对任何 sql-inject 攻击都无懈可击?或者我需要采取措施防止此类攻击?

感谢您的帮助!。

【问题讨论】:

    标签: php sql pdo


    【解决方案1】:

    execute($input_parameters) 与单独的bindParam/bindValue/execute 步骤一样安全,答案基本上是肯定的。

    但是,您可能仍需要采取进一步措施,具体取决于您构建传递给PDO::prepare 调用的查询字符串的方式。并非总是可以对准备好的查询字符串中的所有内容进行参数化。例如,您不能将参数用于表名或列名。如果您允许用户数据或任何外部数据进入该查询字符串,您仍必须在将字符串传递给prepare 之前清理该数据。 有关详细信息,请参阅这些 stackoverflow 问题:

    一般来说,无论如何您都应该过滤所有输入数据,所以如果您想更加安全,您可以使用适合您需要的过滤器来清理任何用于 SQL 类型内容的输入数据,甚至编写一个 FILTER_CALLBACK 自定义如果你愿意的话。 对于来自用户提供的数据的表名或列名,一种常见的验证技术是根据允许的名称数组检查值。

    希望这会有所帮助。祝你好运。注意安全! ;)

    【讨论】:

      【解决方案2】:

      是的,它做同样的事情。我不能说它是无懈可击的,因为底层 SQL 引擎本身可能是脆弱的。但这真的不在你的手中了。

      所以出于所有实际原因,是的,它是安全的。

      编辑:查看PHP Documentation(第一个和第二个示例)。一种是bindParam(),另一种是execute()

      【讨论】:

        猜你喜欢
        • 2014-07-28
        • 2011-04-13
        • 1970-01-01
        • 2013-02-15
        • 2014-08-20
        • 2012-02-04
        • 2012-08-04
        • 2012-09-05
        • 1970-01-01
        相关资源
        最近更新 更多