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注入无关。