mysql - 必须转义哪些字符以防止(My)SQL 注入(inject)?

标签 mysql security escaping character

我正在使用 MySQL API 的函数

mysql_real_escape_string()

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

\0
\n
\r
\
'
"
\Z

现在,我查看了 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 : "\\_",
        }

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

SELECT a FROM b WHERE c = '...user input ...';

用户输入在哪里包含制表符或退格字符?

我的问题在这里:为什么他们在 ESAPI 安全库中包含\b\t?是否有任何情况您可能需要转义这些字符?

最佳答案

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

INSERT INTO students VALUES ("Bobby Tables",12,"abc",3.6);

你 cat 文件,看看没问题,然后将文件通过管道传输到 MySQL。然而,你不知道的是,我放了

DROP TABLE students;\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b

在您没有看到的 INSERT STATEMENT 之前,因为在控制台输出上,退格键覆盖了它。呸!

不过,只是猜测。

编辑(无法抗拒):

alt text

关于mysql - 必须转义哪些字符以防止(My)SQL 注入(inject)?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/1086918/

相关文章:

security - 定义的 ('_JEXEC' )或死 ('Restricted access' )如何工作?

mysql_real_escape_string 问题

C 字符串文字所需的转义字符

c# - 如何在 C# 中将\symbol 添加到字符串的末尾

mysql,如何选择没有节点的树

php - 'PDOException' 消息 'SQLSTATE[HY093] : Invalid parameter number:

php - 如何使用 PHPMyAdmin 导出用户

mysql - ruby rails : How do I execute a function before saving to the database?

regex - 查找所有 DOM 事件监听器的正则表达式

java - 安全可靠地提供子文件夹中的文件资源内容