真正的转义字符串与绑定参数
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 代码。以上是关于真正的转义字符串与绑定参数的主要内容,如果未能解决你的问题,请参考以下文章