2013-05-01 65 views
7

首先,我得到人们想要使用存储过程,以便他们重用查询并逃避处理。不过,我读过很多开发者说,mysqli_real_escape_string不能100%防止SQL注入。有人可以提供一个这样的例子吗?mysqli_real_escape_string如何防止SQL注入失败?

从我关于这个问题的知识有限,我要说的是,mysqli_real_escape_string总是罚款字符串但你可能会被抓出来,除非你核对一下电话号码数值是一个整数,浮点,双等

编辑:我忘了添加一些关键的东西:假设字符集是UTF8并且mysqli_set_charset已被相应调用。我见过的唯一注入依赖少数的字符集(没有一个是UTF8)。

+6

[SQL注入是得到周围mysql_real_escape_string()( http://stackoverflow.com/questions/5741187/sql-injection-that-gets-around-mysql-real-escape-string) – 2013-05-01 09:00:32

+0

+1,JW为链接。 – 2013-05-01 09:05:09

+0

链接的答案太华丽了,我的口味。 – 2013-05-01 09:16:02

回答

6

只要您使用mysqli_set_charset()来设置客户端编码,而mysqli_real_escape_string()用于格式字符串只有,它是完全安全的。但是,如果您的问题隐含在应用程序代码中使用此功能,而不是基于占位符的查询的幕后处理,或者至少以PDO的类似功能(其转义和转义quote()一次引用)它是直接注入的方式。

它不是功能本身是一个问题,但它的使用方式:

  • 因为它只有需要格式化的一部分,人们可以很容易忘记另一部分和陷入困境
  • 或者甚至可能很容易被误用,而不是格式化字符串,而是另一种文字,它根本不会从转义中受益。第二,当它在应用程序代码中正确使用时,它的使用会变得不一致或偶尔出现,因为没有办法强制开发人员正确地格式化每一个文字,而不会失败。这又可能导致不准确和注入。

这就是为什么你必须始终使用占位符在查询中表示数据(而mysqli_real_escape_string可用于处理此占位符没事)

+0

附加警告[必填](http://stackoverflow.com/a/23277864)使用双引号文字重复“NO_BACKSLASH_ESCAPES”模式。 – eggyal 2014-04-25 14:42:56