我应该使用bindParam(), bindValue(),或执行()为PDO准备语句


Should I use bindParam(), bindValue(), or execute() for PDO prepared statements

我读了这个问题(我应该使用bindValue()或execute(array())来避免SQL注入吗?),发现execute(array())和bindParam()在使用PDO和准备好的语句时都可以防止SQL注入。

然而,我还记得在某处读到execute()自动将每个变量视为字符串,而不管它是否是整数。我的问题是,这肯定是一个安全问题,但字符串变量?

例如,如果我要通过一个准备好的查询获得一个等于1的用户的id,但是通过execute传递的参数将被视为字符串而不是整数。

显然,这个脚本没有用户输入的方法,只支持用户输入,如更新配置文件、帖子等。

我正在学习PDO,所以我试图充分了解如何编写安全的PDO查询(或更好的函数),以防止/防止SQL注入和其他安全漏洞。

谢谢

安全性方面,将参数发送到execute()中没有任何问题。所以,你的担心是多余的。给定字符串被安全处理,并且我们将所有参数作为字符串发送,我们可以在逻辑上得出结论,所有参数都被安全处理(请注意,我不怪你的问题)。问总比道歉好。我只是把事情弄清楚)。

将所有参数作为字符串处理的唯一可能的问题是在数据库服务器端。然而,大多数数据库服务器允许SQL中的松散类型,这意味着任何数据文字都将被识别和正确处理,尽管它们是作为字符串发送的。只有少数情况下它不起作用。以下是我的PDO教程中的一段节选:

然而,有时显式设置数据类型会更好。可能的情况有:
    模拟模式下的
  • LIMIT子句或任何其他不能接受字符串操作数的SQL子句。
  • 具有重要查询计划的复杂查询,可能受到错误操作数类型的影响
  • 特殊的列类型,如BIGINTBOOLEAN,需要绑定精确类型的操作数(注意,为了绑定BIGINT)值与PDO::PARAM_INT,你需要一个基于mysqnd安装)。
作为结论,假设您已经关闭了仿真,那么您几乎可以一直使用execute()方法。