我一直在试图找出究竟如何\ X00,\ n,\ r,\或\ X1A可能导致SQL注入(因为它是在http://nl3.php.net/manual/en/function.mysql-real-escape-string.php提及)PHP的mysql_real_escape_string和MySQL注入
我理解单引号和双引号的想法,但是我如何以及为什么需要照顾其他项目以使我的查询安全?
我一直在试图找出究竟如何\ X00,\ n,\ r,\或\ X1A可能导致SQL注入(因为它是在http://nl3.php.net/manual/en/function.mysql-real-escape-string.php提及)PHP的mysql_real_escape_string和MySQL注入
我理解单引号和双引号的想法,但是我如何以及为什么需要照顾其他项目以使我的查询安全?
让我们假设你有
$SQL="select * from mytable where myfield='$uservalue'"
\ - > \:
尝试\' or 1=1; --'
,逃避报价后,你会得到\\' or 1=1; --'
和SQL将select * from mytable where myfield='\\' or 1=1; --'
\ x00
对于PHP不重要,但对于C而言,对于C而言很不重要。
我想知道同样的问题,我找到了答案在C API documentation of MySQL,它指出:编码
字符是“\”,““”“””,NUL(ASCII 0) “\ n”,“\ r”和 Control + Z(\ x1a)。严格地说,MySQL只需要反斜杠和用于引用查询字符串的引号字符进行转义 mysql_real_escape_string()引号其他字符使它们更容易在日志文件中读取 。
也正是在String Literals解释说:
MySQL客户端截断包含NULL字符引用的字符串,如果 他们没有逃脱,并控制+ Z,可以采取档案结尾上 的Windows如果没有逃脱。
NUL字符表示C语言中字符串的结尾,所以这可能会错误地终止mysql客户端程序的输入参数。对于\x1a
也是如此,它在Windows下标记文件结尾(在文件中间的字符的命令提示符下尝试type test.txt
)。
重要的一点是,如果管理员的日志文件读取器不显示超出其中一个字符的数据,管理员可能会错过日志文件中的重要信息。但是谁仍然在Windows下使用不稳定的type
命令或等效命令读取日志文件呢?
在其他方面,有一个在PHP \n
,\r
,\0
或\x1a
没有生命危险,不是潜在地使日志文件难以阅读等。
至于反斜杠,\“OR 1 == 1将被转换为\\” OR 1 == 1如果没有逃脱过,取消报价的逃逸的效果。
干草,非常感谢回复.. 我几乎对反斜杠**“\”**有类似的想法。 但是** \ n,\ r,\ x00,\ x1a **? 也请告诉我更多关于双破折号** - **您在上面的查询示例中使用过。 – 2012-02-15 07:34:27
我认为整个想法只是由于单引号...即使在您的查询中,如果您删除单引号;反斜杠和双破折号以及其他任何内容都不起作用。 但是,我担心** \ n,\ r,\ x00,\ x1a **,因为它在php手册中提到过(http://nl3.php.net/manual/en/function.mysql-实时逃生string.php)。 – 2012-02-15 07:47:43