首先,我知道人们想要使用存储过程,以便他们重用查询并处理转义。然而,我读到很多开发人员都说mysqli_real_escape_string
不能100%防止SQL注入。有人可以提供一个例子吗?
根据我对这个主题的有限知识,我会说mysqli_real_escape_string
would always对于字符串来说没问题,但对于数值来说,除非你检查数字是 int、float、double 等,否则你可能会被抓到。
编辑:我忘记添加一些关键内容:假设字符集是 UTF8 并且已相应地调用 mysqli_set_charset 。我见过的唯一注入依赖于少数字符集(没有一个是 UTF8)。
只要你在使用mysqli_set_charset()
设置客户端编码,以及mysqli_real_escape_string()
用于格式化仅字符串,这是绝对安全的。
但是,如果您的问题暗示在应用程序代码中使用此函数,而不是基于占位符的查询的幕后处理或至少以 PDO 的形式进行处理quote()
-like 函数(它会转义and立即引用)这是直接注入的方式。
问题不是函数本身,而是它的使用方式:
- 因为它只part所需的格式,人们很容易忘记另一部分并陷入麻烦
- 或者甚至它很容易被误用,格式化的不是字符串而是另一个文字,而转义根本没有任何好处。
- 其次,当它在应用程序代码中正确使用时,它的使用会变得不一致或偶尔发生,因为没有办法强制开发人员正确无误地格式化每个文字。这又可能导致不准确和注入。
这就是为什么你必须始终使用占位符表示查询中的数据(而 mysqli_real_escape_string 可以用来处理这个占位符)
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)