2012-02-14 73 views

回答

-1

让我们假设你有

$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而言很不重要。

+0

干草,非常感谢回复.. 我几乎对反斜杠**“\”**有类似的想法。 但是** \ n,\ r,\ x00,\ x1a **? 也请告诉我更多关于双破折号** - **您在上面的查询示例中使用过。 – 2012-02-15 07:34:27

+0

我认为整个想法只是由于单引号...即使在您的查询中,如果您删除单引号;反斜杠和双破折号以及其他任何内容都不起作用。 但是,我担心** \ n,\ r,\ x00,\ x1a **,因为它在php手册中提到过(http://nl3.php.net/manual/en/function.mysql-实时逃生string.php)。 – 2012-02-15 07:47:43

2

我想知道同样的问题,我找到了答案在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如果没有逃脱过,取消报价的逃逸的效果。