如何在用户提供的字符串中安全地允许有限的HTML标记子集?

时间:2013-06-19 14:59:14

标签: php

我正在使用wysiwyg编辑器(ckeditor),我需要允许用户使用这些标签:

a (with only `rel=nofollow`), ul, ol, li, p, strong, br

我还需要避免插入可能危及网站的css或js或其他内容。

strip_tags无法正常工作,因为它允许使用css - 例如,这不能起作用:

<p style="margin:1000px;"> hello </p>

2 个答案:

答案 0 :(得分:1)

HTML Purifier是一个用PHP编写的符合标准的HTML过滤器库。 HTML Purifier不仅会删除所有恶意代码(更好地称为XSS),并且具有经过全面审核,安全且允许的白名单,还可以确保您的文档符合标准,只有通过全面了解W3C的规范才能实现。

答案 1 :(得分:-1)

您可以使用strip_tags()仅允许特定标记。

<?php
    $text = '<p>Test <span>paragraph</span>.</p><!-- Comment --> <a href="#fragment">Other text</a>';
    echo strip_tags($text);
    echo "\n";

    // Allow <p> and <a>
    echo strip_tags($text, '<p><a>');
?>

以上将输出:

Test paragraph. Other text
<p>Test paragraph.</p> <a href="#fragment">Other text</a>

CSS的解决方法

//strip out inline css and simplify style tags 
$search = array('#<(strong|b)[^>]*>(.*?)</(strong|b)>#isu', '#<(em|i)[^>]*>(.*?)</(em|i)>#isu', '#<u[^>]*>(.*?)</u>#isu');

strip_tags无法识别样式标记中的css不是文档文本。要解决此问题,请执行以下操作:

$htmlstring = preg_replace("'<style[^>]*>.*</style>'siU",'',$htmlstring);