真正的转义字符串与绑定参数

Posted

技术标签:

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

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

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

【问题讨论】:

This 'not constructive' question has some good discussion 感谢您的文章,但它没有解释差异 【参考方案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 代码。

以上是关于真正的转义字符串与绑定参数的主要内容,如果未能解决你的问题,请参考以下文章

JAVA 参数传入时 转义字符的处理问题

Angular.js数据绑定时自动转义html标签及内容

C语言基础:转义字符

求教关于shell脚本中参数中的转义空格

Shell编程之循环语句和函数

JS函数传递字符串参数(符号转义)