0

我编写了一个 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 格式,在这种情况下我该怎么办?谢谢。

4

2 回答 2

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>.

于 2013-06-20T07:37:46.690 回答
1

您应该使用strip_tags()函数并只允许您希望用户添加的标签。

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

此行允许<p><a>标记每隔一个标记将被删除。

htmlspecialchars()的工作方式完全不同。

手册

执行的翻译是:

 '&' (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;'

有一篇关于 XSS 预防CSRF预防的非常好的文章,请阅读它。

于 2013-06-20T07:43:10.173 回答