mysqli_real_escape_string如何阻止SQL注入?

tex*_*ate 8 php mysql mysqli

首先,我得到了人们想要使用存储过程,以便他们重用查询并进行转义处理.但是,我看过许多开发人员说mysqli_real_escape_string不能100%阻止SQL注入.有人可以提供一个例子吗?

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

编辑:我忘了添加一些关键的东西:假设字符集是UTF8并且相应地调用了mysqli_set_charset.我见过的唯一一次注射依赖于一些charsets(其中没有一个是UTF8).

You*_*nse 7

只要您使用mysqli_set_charset()设置客户端编码,并且mysqli_real_escape_string()仅用于格式化字符串,它就非常安全.

但是,如果您的问题暗示在应用程序代码中使用此函数,而不是基于占位符的查询的幕后处理,或者至少以PDO的quote()类似函数的形式(它同时进行转义引用),它是直接注射方式.

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

  • 因为它只做了部分所需的格式化,人们很容易忘记另一部分而陷入困境
  • 甚至它很容易被误用,格式化不是字符串,而是另一个文字,根本不会从逃避中受益.
  • 第二,当它在应用程序代码中被正确使用时,它的使用变得不一致或偶然,因为没有办法迫使开发人员正确地格式化每个文字并且没有失败.这又可能导致不准确和注射.

这就是为什么你必须总是使用占位符来表示查询中的数据(而mysqli_real_escape_string可以用来处理这个占位符)