我写了一个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格式,在这种情况下我该怎么做?感谢。
答案 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 '&'
'"' (double quote) becomes '"' when ENT_NOQUOTES is not set.
"'" (single quote) becomes ''' (or ') only when ENT_QUOTES is set.
'<' (less than) becomes '<'
'>' (greater than) becomes '>'