防止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;   
    ?> 
+2

如果要将数据放入数据库,请不要使用'htmlspecialchars',使用数据库的转义方法(例如'mysql_real_escape_string')。 –

+2

@Rocket更好的是,使用PDO和预处理语句,而不是手动转义数据库输入。 PHP核心开发团队真的希望取消过时的mysql/mysqli扩展,但他们不能这么做,因为很多人坚持继续使用它们。 **给所有人:**请尽自己的本分,鼓励使用准备好的声明而不是手动转义。 – rdlowrey

+0

这是一个正确的方向。您需要展示更多代码,这是您应用中的真实世界示例。这仅仅是理论。 –

插入数据库时​​,你不应该编码的HTML specialChars中,(在编辑数据集时,也许不同),这样的数据被操纵。您应该在显示时对它们进行编码。

但是,只要您不忘记使用它,htmlspecialchars()就足以阻止XSS。然而,您使用它的方式与以前一样安全。 XSS通过编码版本被阻止,数据库不关心它。

+4

你说的几乎所有东西都是正确的,但仔细看看OP的代码 - 他使用'htmlspecialchars()'的方式,它不会*阻止XSS –

+0

@Pekka你是对的,我已经添加了一个通知。谢谢。 – TimWolla

+0

是否使用htmlspecialchars取决于上下文。请参阅下面的答案。 – Erlend

不是 - 您在将数据放入数据库(这是不必要的)之前过滤数据,但在输出数据时取消过滤器。

在数据库中存储未经过滤的数据,并输出时逃避它:

echo htmlspecialchars($unfiltered_data_from_database); 
+0

在放入数据库之前,请务必使用'mysql_real_escape_string'。 –

+0

@皮卡,但我需要使用标签,这样我会失去标签,我什么也没做! – wfareed

+1

@wfareed你知道吗:防止XSS是关于编码标签?您还需要诸如减价或BBCodes之类的东西。 – TimWolla

没有,XSS是独立于数据库。为避免SQL注入,您希望使用类似mysql_real_escape_string的函数或使用预准备语句进行转义,但为避免XSS,在输出为HTML时需要转义。

还有一些陷阱。看看OWASP XSS prevention cheat sheet。它解释了如何逃避不同的环境。

用htmlspecialchars /ヶ辆会保护你,如果你是输出标签之间不受信任的数据,但不会保护你,如果你是在说其输出的JavaScript事件处理程序是这样的:

&lt;button onclick="confirm('do you want to delete &lt;?php echo htmlspecialhars($untrusted_data) ?&gt;')"&gt; 

这是因为你转义为HTML而不是javascript。