你应该使用准备好的陈述来逃避吗?

tex*_*ate 5 php mysql

我看到很多人说你应该总是使用预准备语句进行数据库查询.但是,PHP文档说:

每个准备好的语句占用服务器资源.声明应在使用后立即明确关闭.如果没有显式完成,则在PHP释放语句句柄时将关闭该语句.

使用预准备语句并不总是执行语句的最有效方式.仅执行一次的预准备语句会导致客户端 - 服务器往返次数超过未准备好的语句.

来自http://php.net/manual/en/mysqli.quickstart.prepared-statements.php

鉴于上述情况,如果您只打算使用一次查询,那么最好不要使用预准备语句吗?

You*_*nse 5

差异被认为可以忽略不计.

然而,人们必须将本土准备的陈述准备好的陈述的一般概念区分开来.

前者只是大多数DBMS支持的运行查询的一种形式,在此解释.它的用法可以质疑.
后者是用占位符代替实际数据的一般概念,意味着进一步处理替代数据.它被广泛用于编程,一个众所周知的printf()功能就是一个例子.并且后一种方法必须始终用于对数据库运行查询,无论它是否由本机预准备语句支持.因为:

  • 准备好的声明使得正确的格式化(或处理)不可避免.
  • 准备好的声明在唯一适当的位置进行正确的格式化(或处理)- 在查询执行之前,而不是在其他地方,所以,我们的安全不会依赖于像这样不可靠的来源
    • 一些PHP"神奇"功能,它可以破坏数据而不是安全.
    • 一个(或几个)程序员的善意,他们可以决定在程序流程的某个地方格式化(或不格式化)我们的变量.这是非常重要的一点.
  • 预准备语句影响进入查询的非常值,但不影响源变量,源变量保持不变,可以在其他代码中使用(通过电子邮件发送或在屏幕上显示).
  • 准备好的语句可以使应用程序代码大大缩短,在幕后进行所有格式化(*仅在驱动程序允许的情况下).

因此,即使您考虑不使用本机预处理语句(这是非常好的),您也必须始终使用占位符而不是实际数据创建查询.为此,您可以使用完全如上所述工作的PDO - 默认情况下它只是模拟准备,意味着正在创建准备好的查询和数据的常规SQL查询,然后针对数据库运行.

但是,PDO缺乏对许多重要数据类型的支持,例如标识符或数组 - 因此它使您无法始终使用占位符,从而使注入成为可能.幸运的是,safeMysql具有每种数据类型的占位符,并允许您安全地运行查询.