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

时间:2014-03-01 16:24:20

标签: 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,...);

任何人都可以提供一个例子,除了SQL injection gets around mysql_real_escape_string()时案件所涵盖的例子吗?

2 个答案:

答案 0 :(得分:12)

htmlspecialchars无法对关键字符\0(NUL字节),\b(退格)以及\字符进行编码的字符。

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

例如:

SELECT * from user WHERE (name='$login' OR email='$login') AND password='$password'

现在使用以下值:

login:    ) OR 1=1 /*\
password: */--

结果语句如下所示:

SELECT * from user WHERE (name=') OR 1=1 /*\' OR email=') OR 1=1 /*\') AND password='*/--'

相当于:

SELECT * from user WHERE (name=') OR 1=1 /*\' OR email=') OR 1=1

答案 1 :(得分:2)

字符串不是SQL与之交互的唯一东西。

$result = "SELECT * FROM user WHERE id = " . htmlspecialchars($_GET['id']);

这是参数化查询非常方便的地方。