mysql_real_escape_string VS 加号

2022-08-30 11:51:55

有人可以从PHP手册中阐明这两个函数之间的差异吗:

addslashes:返回一个字符串,在数据库查询等中需要用引号括起来的字符之前带有反斜杠。这些字符是单引号 (')、双引号 ()、反斜杠 () 和 NUL(空字节)。

mysql_real_escape_string:调用 MySQL 的库函数,该函数将反斜杠预置为以下字符:\x00、\n、\r、、'、“ 和 \x1a。mysql_real_escape_string()mysql_real_escape_string

从我收集到的主要区别是\x00,\n\r \x1a不会逃脱,你能告诉我这有什么意义吗?addslashes


答案 1

你引用的内容可能来自文档,但据我所知,这不一定是真的。

addslashes向通常令人不安的字符添加斜杠。 逃避任何需要转义的MySQL。这可能比照顾的字符更多或更少。mysql_real_escape_stringaddslashes

另外,不一定会添加斜杠来转义。虽然我认为如果你这样做是有效的,但最新版本的MySQL通过将其中两个放在一起来转义引号,而不是在它前面放一个斜杠。mysql_real_escape_string

我相信您应该始终使用数据提供程序的转义功能而不是 ,因为对于您使用它的目的,可能会做太多或没有足够的工作。另一方面,知道如何准备字符串以将其嵌入查询中。即使规范改变了关于如何转义的东西,突然之间你应该不再使用反斜杠,你的代码仍然会工作,因为你会意识到它。addslashesaddslashesmysql_real_escape_stringmysql_real_escape_string


答案 2

mysql_real_escape_string() 还会考虑当前数据库连接所使用的字符集。

PHP 函数 mysql_real_escape_string() 使用同名的 MySQL C API 函数:http://dev.mysql.com/doc/refman/5.1/en/mysql-real-escape-string.html

另请阅读著名的 PHP 安全专家 Chris Shiflett 的 addslashes() 与 mysql_real_escape_string() 的对比,了解即使您使用 addslashes() 也可以获得 SQL 注入漏洞的演示。


其他人建议使用查询参数,然后您不必对动态值进行任何转义。我也建议这样做,但是在PHP中,你必须切换到PDO或ext / mysqli,因为普通的ext / mysql API不支持查询参数。

此外,在某些极端情况下,您不能将查询参数用于动态字符串值,例如全文搜索中的搜索模式。


推荐