mysql_real_escape_string VS addslashes

时间:2010-08-13 00:26:57

标签: php mysql

有人可以从PHP手册

中了解这两个功能之间的差异

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

mysql_real_escape_string: mysql_real_escape_string()调用MySQL的库函数mysql_real_escape_string,它将反斜杠添加到以下字符:\ x00,\ n,\ r,\,',“和\ x1a。

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

感谢

5 个答案:

答案 0 :(得分:48)

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

addslashes会为通常令人不安的字符添加斜杠。 mysql_real_escape_string逃脱了MySQL需要转义的内容。这可能比addslashes照顾的字符更多或更少。

此外,mysql_real_escape_string不一定会添加斜杠来逃避。虽然我认为如果你这样做是有效的,但最新版本的MySQL通过将两个放在一起而不是在它之前放一个斜杠来逃避引用。

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

答案 1 :(得分:14)

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() Versus mysql_real_escape_string(),以获得即使您使用addslashes()也可以获得SQL注入攻击的演示。


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

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

答案 2 :(得分:1)

mysql_escape_stringmysql_real_escape_string有很多历史记录。他们都试图提供一种“通用”转义机制,以最大限度地减少sql注入攻击的可能性。

mysql_real_escape_stringaddslashes可以,如果它们是您真正需要的 - 但它们可能不是。

正如@afrazier所说,你应该使用prepared statements

答案 3 :(得分:1)

而不是使用PDO准备查询,你可以在你的应用程序使用MySQLi时使用它(小心!“我和”mysql“)

$nick = $connect->real_escape_string($nick);
$nick= addcslashes($nick, '%_');

$pass = $connect->real_escape_string($pass);
$pass = addcslashes($pass, '%_');

答案 4 :(得分:0)

忽略两者并仅使用参数化查询。当然,除非你喜欢注射攻击。