防止XSS攻击
问题描述:
此代码是否安全以防止XSS攻击?防止XSS攻击
<?php
$string = "<b>hello world!</b>";
echo "without filtering:".$string;
echo "<br>";
$filtered = htmlspecialchars($string); // insert into database filtered
echo "After filtering:".$filtered;
echo "<br>";
$de_filtering = htmlspecialchars_decode($filtered); //retrieve from database and display
echo "After de-filtering:".$de_filtering;
?>
答
插入数据库时,你不应该编码的HTML specialChars中,(在编辑数据集时,也许不同),这样的数据被操纵。您应该在显示时对它们进行编码。
但是,只要您不忘记使用它,htmlspecialchars()
就足以阻止XSS。然而,您使用它的方式与以前一样安全。 XSS通过编码版本被阻止,数据库不关心它。
答
没有,XSS是独立于数据库。为避免SQL注入,您希望使用类似mysql_real_escape_string的函数或使用预准备语句进行转义,但为避免XSS,在输出为HTML时需要转义。
还有一些陷阱。看看OWASP XSS prevention cheat sheet。它解释了如何逃避不同的环境。
用htmlspecialchars /ヶ辆会保护你,如果你是输出标签之间不受信任的数据,但不会保护你,如果你是在说其输出的JavaScript事件处理程序是这样的:
<button onclick="confirm('do you want to delete <?php echo htmlspecialhars($untrusted_data) ?>')">
这是因为你转义为HTML而不是javascript。
如果要将数据放入数据库,请不要使用'htmlspecialchars',使用数据库的转义方法(例如'mysql_real_escape_string')。 –
@Rocket更好的是,使用PDO和预处理语句,而不是手动转义数据库输入。 PHP核心开发团队真的希望取消过时的mysql/mysqli扩展,但他们不能这么做,因为很多人坚持继续使用它们。 **给所有人:**请尽自己的本分,鼓励使用准备好的声明而不是手动转义。 – rdlowrey
这是一个正确的方向。您需要展示更多代码,这是您应用中的真实世界示例。这仅仅是理论。 –