【发布时间】:2012-09-05 02:41:18
【问题描述】:
execute($input_parameter) 是否像 bindParam/bindValue 一样防止 sql 注入?
如果答案是肯定的,bindParam()/bindValue()/execute() 对任何 sql-inject 攻击都无懈可击?或者我需要采取措施防止此类攻击?
感谢您的帮助!。
【问题讨论】:
execute($input_parameter) 是否像 bindParam/bindValue 一样防止 sql 注入?
如果答案是肯定的,bindParam()/bindValue()/execute() 对任何 sql-inject 攻击都无懈可击?或者我需要采取措施防止此类攻击?
感谢您的帮助!。
【问题讨论】:
就execute($input_parameters) 与单独的bindParam/bindValue/execute 步骤一样安全,答案基本上是肯定的。
但是,您可能仍需要采取进一步措施,具体取决于您构建传递给PDO::prepare 调用的查询字符串的方式。并非总是可以对准备好的查询字符串中的所有内容进行参数化。例如,您不能将参数用于表名或列名。如果您允许用户数据或任何外部数据进入该查询字符串,您仍必须在将字符串传递给prepare 之前清理该数据。
有关详细信息,请参阅这些 stackoverflow 问题:
一般来说,无论如何您都应该过滤所有输入数据,所以如果您想更加安全,您可以使用适合您需要的过滤器来清理任何用于 SQL 类型内容的输入数据,甚至编写一个 FILTER_CALLBACK 自定义如果你愿意的话。 对于来自用户提供的数据的表名或列名,一种常见的验证技术是根据允许的名称数组检查值。
希望这会有所帮助。祝你好运。注意安全! ;)
【讨论】:
是的,它做同样的事情。我不能说它是无懈可击的,因为底层 SQL 引擎本身可能是脆弱的。但这真的不在你的手中了。
所以出于所有实际原因,是的,它是安全的。
编辑:查看PHP Documentation(第一个和第二个示例)。一种是bindParam(),另一种是execute()。
【讨论】: