必须转义哪些字符才能阻止(我的)SQL注入?

Tow*_*wer 15 mysql security escaping character

我正在使用MySQL API的功能

mysql_real_escape_string()
Run Code Online (Sandbox Code Playgroud)

根据文档,它会转义以下字符:

\0
\n
\r
\
'
"
\Z
Run Code Online (Sandbox Code Playgroud)

现在,我查看了OWASP.org的ESAPI安全库,在Python端口中,它有以下代码(http://code.google.com/p/owasp-esapi-python/source/browse/esapi/codecs/mysql. py):

        """
        Encodes a character for MySQL.
        """
        lookup = {
        0x00 : "\\0",
        0x08 : "\\b",
        0x09 : "\\t",
        0x0a : "\\n",
        0x0d : "\\r",
        0x1a : "\\Z",
        0x22 : '\\"',
        0x25 : "\\%",
        0x27 : "\\'",
        0x5c : "\\\\",
        0x5f : "\\_",
        }
Run Code Online (Sandbox Code Playgroud)

现在,我想知道是否真的需要转义所有这些角色.我理解为什么%和_在那里,它们是LIKE运算符中的元字符,但我不能简单地理解他们为什么添加退格和制表符字符(\ b\t)?如果您执行查询,是否存在安全问题:

SELECT a FROM b WHERE c = '...user input ...';
Run Code Online (Sandbox Code Playgroud)

用户输入包含制表符或退格符的位置?

我的问题是:为什么它们在ESAPI安全库中包含\ b\t?在任何情况下你可能需要逃避这些角色吗?

bal*_*pha 47

关于退格字符的猜测:想象一下,我发送了一封电子邮件"嗨,这是根据需要更新数据库的查询"和附带的文本文件

INSERT INTO students VALUES ("Bobby Tables",12,"abc",3.6);
Run Code Online (Sandbox Code Playgroud)

你捕获文件,看到它没关系,只是将文件传输到MySQL.然而,你不知道的是我提出的问题

DROP TABLE students;\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b
Run Code Online (Sandbox Code Playgroud)

在您没有看到的INSERT STATEMENT之前,因为在控制台输出上,退格会覆盖它.BAMM!

不过只是一个猜测.

编辑(无法抗拒):

替代文字

  • +1用于参考我最喜欢的XKCD漫画 (15认同)
  • 感谢Stefano,它符合CC许可证的归属条款. (3认同)

Gum*_*mbo 16

字符串MySQL手册页说:

  • \0   ASCII NUL(0x00)字符.
  • \'   单引号(" '")字符.
  • \"   双引号(" "")字符.
  • \b   退格字符.
  • \n   换行符(换行符).
  • \r   回车符.
  • \t   制表符.
  • \Z   ASCII 26(Control-Z).请参阅下表后面的注释.
  • \\   反斜杠(" \")字符.
  • \%   一个" %"字符.请参阅下表后面的注释.
  • \_   一个" _"字符.请参阅下表后面的注释.