考虑mysql_real_escape_string()手册中的以下几行:
MySQL 只要求对查询中用于引用字符串的反斜杠和引号字符进行转义。mysql_real_escape_string()引用其他字符以使它们更容易在日志文件中阅读。
MySQL 中的 SQL 注入不应该单独使用这些特殊字符:\b
\0
\n
\r
\t
\Z
。
然而,字符串文字手册指出以下但指定(或不指定)的原因与 SQL 注入无关:
如果要将二进制数据插入字符串列(例如BLOB列),则应使用转义序列表示某些字符。反斜杠 (“\”) 和用于引用字符串的引号字符必须进行转义。在某些客户端环境中,可能还需要转义 NUL 或 Control+Z。如果未转义, mysql客户端会截断包含 NUL 字符的引用字符串,如果未转义,则可能会在 Windows 上将 Control+Z 用于 END-OF-FILE。
此外,在一个简单的测试中,无论天气如何,上面列出的特殊字符是否被转义,MySQL 都产生了相同的结果。换句话说,MySQL 甚至不介意:
$query_sql = "SELECT * FROM `user` WHERE user = '$user'";
上面的查询对于上面列出的字符的非转义和转义版本的工作类似,如下所示:
$user = chr(8); // Back Space
$user = chr(0); // Null char
$user = chr(13); // Carriage Return
$user = chr(9); // Horizontal Tab
$user = chr(26); // Substitute
$user = chr(92) .chr(8); // Escaped Back Space
$user = chr(92) .chr(0); // Escaped Null char
$user = chr(92) .chr(13); // Escaped Carriage Return
$user = chr(92) .chr(9); // Escaped Horizontal Tab
$user = chr(92) .chr(26); // Escaped Substitute
简单测试中使用的测试表和数据:
-- Table Structure
CREATE TABLE IF NOT EXISTS `user` (
`id` int(11) NOT NULL AUTO_INCREMENT,
`user` varchar(10) CHARACTER SET utf8 NOT NULL,
PRIMARY KEY (`id`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8;
-- Table Data
INSERT INTO `user` ( `user` ) VALUES
( char( '8' ) ),
( char( '0' ) ),
( char( '10' ) ),
( char( '13' ) ),
( char( '9' ) ),
( char( '26' ) );