【问题标题】:Real escape string vs bind param真正的转义字符串与绑定参数
【发布时间】:2014-09-11 11:25:05
【问题描述】:

在php中,有什么区别,哪个更好,为什么,使用mysqli。

我有一个用真正的转义字符串编写的整个项目,是否有必要转换为面向对象的预处理语句?

【问题讨论】:

标签: php mysqli sql-injection


【解决方案1】:

从程序员的角度来看,手动转义值和 PDO 实现的参数化/准备语句之间的区别在于分离程度、自动化程度和责任转移。

对于*_escape_string,开发人员必须确保所有值:

  • 通过相应的*_escape_string函数传递
  • 放置在 SQL 字符串文字中,因为 *_escape_string 函数仅用于转义字符串文字值。

如果开发人员有规律地跟踪每个参数的处理,这可以完美地工作。但它往往会变得更复杂,因此越复杂的语句就越容易出错。

如果只有一个参数缺少适当的处理或处理,则该语句很容易受到 SQL 注入的攻击。老实说,Stack Overflow 上实际上有很多案例表明这种手动技术更容易出错,因为很容易错过上述几点。

与此相反,PDO 通过在语句中仅包含占位符来提供抽象层。参数值单独传递,PDO 负责正确的处理和处理。开发人员所要做的就是使用占位符准备语句,然后使用实际值执行准备好的语句。

现在哪个更好?显然后一种 PDO 变体,因为它更不容易出错并且更干净。开发人员需要考虑和处理的事情更少,因为现在由 PDO 完成。

【讨论】:

  • 谢谢,所以除了界面之外没有根本的区别。您能否详细说明“放置在 SQL 字符串文字中,因为 *_escape_string 函数仅用于转义字符串文字值。”我不太明白这句话
  • @user3667450 *_escape_string 函数并不神奇。他们只是转义了某些在字符串文字中很关键的字符。例如,mysql_real_escape_string 转义字符 NULL (\0)、LINE FEED (\n)、回车 (\r)、反斜杠 (\)、撇号 (')、引号 (@ 987654333@) 和替代 (\x1a)。其中一些在 MySQL string literals 中很关键,因为它们表示字符串文字的结尾或引入了转义序列。
  • @user3667450 但是,如果您在字符串文字之外使用该值,则攻击者无需从字符串文字中逃脱以注入任意 SQL 代码。
猜你喜欢
  • 1970-01-01
  • 2012-07-03
  • 1970-01-01
  • 1970-01-01
  • 2011-04-12
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多