虽然许多来源引用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()时案件所涵盖的例子吗?
答案 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']);
这是参数化查询非常方便的地方。