htmlspecialchars是否足以阻止对单引号括起来的变量进行SQL注入?

cre*_*ate 4 php sql security sql-injection

尽管许多人士引述htmlspecialchars与功能ENT_QUOTES足够的,以防止SQL注入,他们没有提供概念的证明.我自己也想不到任何可能性.

让我们考虑以下示例:

$username = htmlspecialchars($_GET['name'], ENT_QUOTES, 'UTF-8');
$sql = "SELECT * from user WHERE name='$username'";
mysql_query($sql,...);
Run Code Online (Sandbox Code Playgroud)

任何人都可以提供一个示例,除了SQL注入绕过mysql_real_escape_string()时的情况吗?

Gum*_*mbo 13

该字符htmlspecialchars不能编码关键字符\0(NUL字节), \b(退格键),以及所述\字符.

为了利用这一点,您需要一个包含多个注入点的语句.使用此方法,您可以转义一个字符串文字的结束分隔符,从而将其扩展到下一个字符串文字的下一个起始分隔符.然后可以将三个带有注入点的字符串文字转换为两个字符串文字.

例如:

SELECT * from user WHERE (name='$login' OR email='$login') AND password='$password'
Run Code Online (Sandbox Code Playgroud)

现在具有以下值:

login:    ) OR 1=1 /*\
password: */--
Run Code Online (Sandbox Code Playgroud)

结果语句如下所示:

SELECT * from user WHERE (name=') OR 1=1 /*\' OR email=') OR 1=1 /*\') AND password='*/--'
Run Code Online (Sandbox Code Playgroud)

这相当于:

SELECT * from user WHERE (name=') OR 1=1 /*\' OR email=') OR 1=1
Run Code Online (Sandbox Code Playgroud)