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

我读过这个问题(我应该使用bindValue()还是execute(array())来避免SQL注入?),并发现execute(array())和bindParam()在处理PDO和预处理语句时都会阻止SQL注入。

不过,我还记得在某处execute()会自动将每个变量视为一个字符串,无论它是一个整数。 我的问题肯定是除了字符串变量以外,这是一个安全问题?

例如,如果我通过准备好的查询来获取用户的id,那么通过execute执行的参数将被视为字符串而不是整数。

显然这个脚本没有用户输入的方法,并且只会支持用户输入,例如更新配置文件,文章等。

我正在学习PDO,所以我想完全理解如何编写安全的PDO查询(或更好的功能),以防止/防范SQL注入和其他安全漏洞。

谢谢


安全性方面,将参数发送到execute()方面没有任何问题。 所以,你的担心是多余的。 鉴于字符串被安全地处理,并且我们将所有的参数作为字符串发送,我们可以合理地断定所有参数都是安全处理的(请注意,我不会责怪你的问题,总是问得好,而不是抱歉,我只是简单地说) 。

将所有参数视为字符串唯一可能的问题是在数据库服务器端。 然而,大多数数据库服务器允许在SQL中宽松输入,意味着尽管以字符串形式发送,但任何数据文字都将被正确识别和处理。 只有少数边缘情况下不起作用。 以下是关于此事的我的PDO教程摘录:

但是,有时最好明确地设置数据类型。 可能的情况是:

  • 仿真模式中的LIMIT子句或任何其他不能接受字符串操作数的SQL子句。
  • 具有可能受错操作数类型影响的非平凡查询计划的复杂查询
  • 特殊的列类型,如BIGINTBOOLEAN ,需要绑定确切类型的操作数(注意,为了将BIGINT值与PDO :: PARAM_INT绑定,需要基于mysqlnd的安装)。
  • 总而言之,如果您已经关闭仿真,则几乎可以一直使用execute()方法。

    链接地址: http://www.djcxy.com/p/66711.html

    上一篇: Should I use bindParam(), bindValue(), or execute() for PDO prepared statements

    下一篇: PDO Prepared Statement returns 0 rows, but query works fine