2016-08-21 65 views
1

我读这个问题(Should I use bindValue() or execute(array()) to avoid SQL injection?),并发现execute(array())和bindParam()都防止SQL注入处理PDO并准备好陈述。我应该使用bindParam(),bindValue(),或执行()PDO预处理语句

但是我也记得读书的地方,执行()自动将每一个变量为一个字符串,如果不管它是一个整数。我的问题肯定是除了字符串变量以外,这是一个安全问题?

例如,如果我是让在那里通过一个准备好的查询等于1的用户的ID,但是穿过执行参数将被视为一个字符串不是整数。

显然,这个脚本不会有任何用户输入的方法,并且只支持用户输入比如更新个人资料,邮寄等

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

感谢

+0

你可以强制与bindParam参数类型,如果这就是你要找的内容。 http://php.net/manual/en/pdostatement.bindparam.php http://php.net/manual/en/pdo.constants.php – Linesofcode

+0

你也可以做到这一点与PDOStatement对象:: bindValue。 http://php.net/manual/en/pdostatement.bindvalue.php –

回答

1

安全明智的,不存在与发送参数到执行一个单一的问题()。所以,你的担心是多余的。鉴于字符串被安全地处理,并且我们将所有的参数作为字符串发送,我们可以合理地断定所有参数都是安全处理的(请注意,我不会责怪你的问题,总是要求比抱歉要好,我只是简单地说) 。

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

但是,有时最好是明确设置数据类型。 可能的情况是:在仿真模式,或者只是不能接受一个字符串操作数的任何其他SQL子句

  • LIMIT子句。
  • 与非平凡的查询计划复杂的查询,可以由一个错误的操作数类型的影响
  • 特有列类型,像BIGINTBOOLEAN需要确切类型的操作数被束缚(注意,为了以结合BIGINT 值与PDO :: PARAM_INT你需要一个基于mysqlnd的 安装)。

作为结论,给你已经开启仿真关闭,您可以使用execute()方法,几乎​​所有的时间。