我有<textarea>
我允许提交用户内容。我想允许一些标记,例如<b>
,<i>
,<blockquote>
和<del>
。但是,由于内容将显示在页面中,我必须确保没有未关闭的标签。
我知道我可以使用strip_tags($textarea, '<b><i><blockquote><del>')
,但我怎样才能确保所有剩余的代码都已正确关闭?
答案 0 :(得分:5)
您可以使用Tidy。它将清理和清理您的HTML。
这条评论在php.net上解决了你的问题,并展示了如何解决它:http://www.php.net/manual/en/tidy.examples.basic.php#89334
清理html片段(OO支持 现在看来似乎只有半个多了)
这将确保关闭所有标签, 没有添加任何html / head / body标签 在它周围。
<?php
$tidy_config = array(
'clean' => true,
'output-xhtml' => true,
'show-body-only' => true,
'wrap' => 0,
);
$tidy = tidy_parse_string($html_fragment, $tidy_config, 'UTF8');
$tidy->cleanRepair();
echo $tidy;
?>
答案 1 :(得分:0)
DOMDocument扩展提供了一个用于操作HTML DOM结构的API,应该值得为此考虑。
答案 2 :(得分:0)
您确实希望使用正确的HTML过滤库,例如HTMLPurifier,尤其是因为您计划使用提交的内容来显示样式。 HTMLPurifier同时考虑属性,css和其他内联样式以避免XSS,并且还会尝试(通过使用已经建议的Tidy)来清理HTML并清除任何缺少的标记(以确保生成的片段符合XHTML)。
我认为Tidy不会尝试删除任何邪恶的XSS段。