这个问题已经在这里有一个答案:
- SQL注入,围绕mysql_real_escape_string得到() 4个回答
首先,我得到人们想要让他们重复使用查询,并有逃跑的照顾到使用存储过程。 不过,我看过很多开发商说mysqli_real_escape_string
不能100%防止SQL注入。 可有人请提供这方面的一个例子吗?
从我关于这个问题的知识有限,我要说的是, mysqli_real_escape_string
将永远是罚款字符串而是数值你可能会被抓出来,除非你核对一下电话号码是一个整数,浮点,双等。
编辑:我忘了补充一点至关重要:假设字符集是UTF8和mysqli_set_charset已经相应地调用。 我见过的唯一依靠注射字符集(其中没有一个是UTF8)的屈指可数。
只要您使用mysqli_set_charset()
设置客户端编码,并mysqli_real_escape_string()
用于格式字符串只 ,这是完全安全的。
但是,如果使用此功能直接在应用程序代码,而不是幕后的基于占位查询的处理或PDO的形式至少你的问题暗示的quote()
式的函数(不逃逸,并在一次报价)它是直的方式注入。
它不是功能本身是一个问题,但它的使用方式:
- 因为它仅要求格式的一部分 ,人们可以很容易忘记另一部分和陷入困境
- 甚至它可以很容易被滥用,格式化并不是一个字符串,但另一个字面这将不逃逸的所有好处。
- 第二,当它的使用权在应用程序代码,它的使用变得不一致或偶然的,因为没有办法强迫开发者正确地格式化每个文字和没有失败。 这又可能导致不准确和注射。
这就是为什么你必须始终使用占位符在查询中表示数据(而mysqli_real_escape_string可用于处理此占位符没事)
文章来源: How can mysqli_real_escape_string fail to prevent a SQL injection? [duplicate]