我一直试图弄清楚 \ x00,\ n,\ r,\或\ x1a 是如何导致SQL注入的(正如http://nl3.php.net/manual/en/function.mysql-real-escape-string.php中提到的那样)
我理解单引号和双引号的概念,但是我需要如何以及为什么需要处理其他项目以使我的查询安全?
答案 0 :(得分:2)
我想知道同样的问题,我在C API documentation of MySQL找到答案,它说:
编码的字符是“\”,“'”,“”“,NUL(ASCII 0),”\ n“,”\ r“和 Control + Z(\ x1a)。严格来说,MySQL只需要反斜杠和 用于引用查询中字符串的引号字符将被转义。 mysql_real_escape_string()引用其他字符来制作它们 更容易阅读日志文件。
在String Literals中也解释了:
mysql客户端截断包含NUL字符的带引号的字符串if 它们不会被转义,Control + Z可能会被用于END-OF-FILE Windows如果没有转义。
NUL字符表示C语言中字符串的结尾,因此这可能会错误地终止mysql客户端程序的输入参数。 \x1a
也是如此,它标记Windows下的文件结尾(在命令提示符中尝试type test.txt
,文件中间带有\x1a
字符。)
主要观点是,如果管理员的日志文件阅读器未显示超出其中一个字符的数据,则管理员可能会错过日志文件中的重要信息。但是谁还在Windows下使用不稳定的type
命令或等效命令来读取日志文件呢?
换句话说,PHP中的\n
,\r
,\0
或\x1a
没有危险,除非可能使日志文件难以阅读。< / p>
对于反斜杠, \'OR 1 == 1 如果没有转义,也会转换为 \\'或1 == 1 ,取消逃避报价的影响。
答案 1 :(得分:-1)
让我们假设你有
$SQL="select * from mytable where myfield='$uservalue'"
\ - &gt; \ 强>:
尝试\' or 1=1; --'
,在转义引号后,您将获得\\' or 1=1; --'
,SQL将为select * from mytable where myfield='\\' or 1=1; --'
<强> \ X00 强>
对PHP不重要,但对于C
抱歉,其余的都懒得。