Php htmlspecialchars是否足以阻止对单引号中包含的变量进行SQL注入?

Php htmlspecialchars是否足以阻止对单引号中包含的变量进行SQL注入?,php,sql,security,sql-injection,Php,Sql,Security,Sql Injection,尽管许多源引用了htmlspecialchars函数,其中entu引号不足以阻止SQL注入,但它们都没有提供这一概念的证明。我自己想不出有什么可能 我们考虑下面的例子: $username = htmlspecialchars($_GET['name'], ENT_QUOTES, 'UTF-8'); $sql = "SELECT * from user WHERE name='$username'"; mysql_query($sql,...); 除了本案例中涉及的案例外,还有其他案例吗 SQ

尽管许多源引用了
htmlspecialchars
函数,其中
entu引号
不足以阻止SQL注入,但它们都没有提供这一概念的证明。我自己想不出有什么可能

我们考虑下面的例子:

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

除了本案例中涉及的案例外,还有其他案例吗

SQL与字符串交互的不仅仅是字符串

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

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

对关键字符
\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

mysql\u real\u escape\u字符串在这里都没有帮助。所以这不是为什么htmlspecialchars在这个比较中不安全的原因。@mithy是的,这就是为什么您应该在MySQLi或PDO中使用参数化查询的原因
mysql\u real\u escape\u string
与其他
mysql\u函数一起被弃用。我针对您的问题提供了一个示例—在这种情况下,用户输入的
htmlspecialchars
不会使SQL查询安全。这个问题根本没有提到
mysql\u real\u escape\u string
。我想他在期待$\u GET['id']的输入会导致SQL注入,如果
htmlspecialchars
ENT\u QUOTES
@Manu一起使用,在这个例子中,
$\u GET['id']
1或1=1
将起到注入的作用,mysql\u real\u escape\u string做什么?PHP的
htmlspecialchars
函数用于转义对浏览器有特殊意义的字符,如尖括号,使其显示为普通字符,而不是解释为HTML标记。它与SQL或阻止SQL注入无关。