如何输出HTML但防止XSS攻击

时间:2013-06-20 07:31:10

标签: php xss

我写了一个PHP脚本来获取电子邮件内容。

这些内容是HTML格式。

我想显示内容,如下所示

<?php 
$email_content = '
    <html>
        <script>alert("XSS");</script>
        <body>
            <div>Line1</div>
            <div>Line2</div>
        </body>
    </html>
';
echo $email_content;
?>

如您所见,它会导致XSS攻击。但是如果我使用htmlspecialchars函数,它将无法显示正确的HTML格式,在这种情况下我该怎么做?感谢。

2 个答案:

答案 0 :(得分:5)

HTMLPurifer可以做到这一点:

require_once '/path/to/HTMLPurifier.auto.php';

$config = HTMLPurifier_Config::createDefault();
$purifier = new HTMLPurifier($config);
$clean_html = $purifier->purify($dirty_html);

它需要脏HTML(即可能包含Javascript)并删除任何脚本。

PHP没有任何本机或内置的可以像HTMLPurifier一样删除Javacript的东西。您可以使用DOMDocument,但这将是一项冗长的任务,因为Javascript可以在某些属性中执行(onerror,onclick),并且不仅限于<script></script>

答案 1 :(得分:1)

您应该使用strip_tags()功能,并且只允许您希望用户添加的标签。

echo strip_tags($text, '<p><a>');

此行允许<p><a>标记移除其他所有标记。

htmlspecialchars()完全不同。

来自manual

  

执行的翻译是:

 '&' (ampersand) becomes '&amp;'
 '"' (double quote) becomes '&quot;' when ENT_NOQUOTES is not set.
 "'" (single quote) becomes '&#039;' (or &apos;) only when ENT_QUOTES is set.
 '<' (less than) becomes '&lt;'
 '>' (greater than) becomes '&gt;'

非常nice article about XSS preventionCSRF prenvetion读取它。