关于php:mysql_real_escape_string和adslashes有什么区别?

关于php:mysql_real_escape_string和adslashes有什么区别?

What is the difference between mysql_real_escape_string and addslashes?

mysql_real_escape_stringaddslashes都用于在数据库查询之前对数据进行转义,所以有什么区别? (此问题与参数化查询/ PDO / mysqli无关)


string mysql_real_escape_string ( string $unescaped_string [, resource $link_identifier ] )
mysql_real_escape_string() calls MySQL's library function mysql_real_escape_string, which prepends backslashes to the following characters: \x00,
,
, \, '," and \x1a.

string addslashes ( string $str )
Returns a string with backslashes before characters that need to be quoted in database queries etc. These characters are single quote ('), double quote ("), backslash (\) and NUL (the NULL byte).

它们影响不同的角色。 mysql_real_escape_string特定于MySQL。 Addslashes只是一个通用函数,可能适用于其他事物以及MySQL。


mysql_real_escape_string()具有通过可选的link_identifier参数相对于数据库的字符集正确转义文本输入的附加好处。

字符集意识是至关重要的区别。 addslashes()将在每个要转义的字符的每八位二进制表示形式之前添加一个斜杠。

如果您使用某种形式的多字节字符集,则可能(尽管可能仅是由于字符集的设计不佳),但十六位或三十二位字符表示形式的一半或一半与字符的八位相同< x6>将添加一个斜线。

在这种情况下,您可能会在不应该转义的字符之前添加斜杠,或者更糟的是,您可能会在16(或32)位字符的中间出现斜杠,这会破坏数据。

如果需要转义数据库查询中的内容,则应尽可能使用mysql_real_escape_string()。如果您确定数据库或表仅使用7或8位ASCII编码,则addslashes()很好。


情况1:

1
2
3
4
5
$str ="input's data";

print mysql_real_escape_string($str);      input\'s data

print addslashes($str);                    input\'s data;

情况2:

1
2
3
4
5
$str ="input\'s data";

print mysql_real_escape_string($str);      input\'s data

print addslashes($str);                    input\'s data;

接收二进制数据时应使用mysql_real_escape_stringaddslashes用于文本输入。

您可以在这里看到差异:mysql-real-escape-string和addslashes


看来mysql_real_escape_string是二进制安全的-文档指出:

If binary data is to be inserted, this function must be used.

我认为始终使用mysql_real_escape_string可能比添加斜杠更安全。


推荐阅读