我应该为PDO预处理语句使用bindParam(),bindValue()或execute()

时间:2016-08-21 10:07:31

标签: php mysql pdo prepared-statement

我读了这个问题(Should I use bindValue() or execute(array()) to avoid SQL injection?),发现在使用PDO和预处理语句时,execute(array())和bindParam()都会阻止SQL注入。

但是我还记得在某处读取execute()会自动将每个变量视为一个字符串,无论它是否为整数。我的问题肯定是除了字符串变量之外的任何问题都是安全问题吗?

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

显然这个脚本没有用户输入的方法,只支持用户输入,例如更新个人资料,帖子等。

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

由于

1 个答案:

答案 0 :(得分:5)

安全性方面,将参数发送到execute()没有任何问题。所以,你的担忧是多余的。鉴于字符串被安全地处理并且我们将所有参数作为字符串发送,我们可以逻辑地得出所有参数都得到安全处理的结论(请注意,我不会责怪你的问题。它总是更好问而不是抱歉。我我只是把事情做好了。

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

  

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

     
      
  • 仿真模式下的LIMIT子句或任何其他无法接受字符串操作数的SQL子句。
  •   
  • 具有可能受错误操作数类型影响的非平凡查询计划的复杂查询
  •   
  • 特殊的列类型,如BIGINTBOOLEAN,需要绑定精确类型的操作数(请注意,为了绑定BIGINT   使用PDO :: PARAM_INT的值你需要一个基于mysqlnd的   安装)。
  •   

作为结论,假设你已经关闭了仿真,你几乎可以一直使用execute()方法。