PHP的mysql_real_escape_string和MySQL注入

时间:2012-02-14 15:55:33

标签: mysql-real-escape-string

我一直试图弄清楚 \ x00,\ n,\ r,\或\ x1a 是如何导致SQL注入的(正如http://nl3.php.net/manual/en/function.mysql-real-escape-string.php中提到的那样)

我理解单引号和双引号的概念,但是我需要如何以及为什么需要处理其他项目以使我的查询安全?

2 个答案:

答案 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

抱歉,其余的都懒得。