清理HTML输入

时间:2011-04-01 11:27:01

标签: php html sanitization

我正在考虑添加一个富文本编辑器,以允许非程序员更改文本的方面。但是,有一个问题是,如果标记不正确,则可能会扭曲呈现页面的布局。什么是一种很好的轻量级方法来消毒html?

5 个答案:

答案 0 :(得分:18)

您必须在优质和轻量级之间做出决定。推荐的选择是'HTMLPurifier',因为它提供了毫不费力的安全默认值。作为更快的替代方案,通常建议使用“htmLawed”。

另请参阅HTMLPurifier作者的这篇非常客观的概述:http://htmlpurifier.org/comparison

答案 1 :(得分:6)

我非常喜欢HTML Purifier,它允许您指定HTML代码中允许的标签和属性 - 并生成有效的HTML。

答案 2 :(得分:2)

使用BB代码(或类似于此处的SO),否则机会非常渺茫。 功能示例......

function parse($string){

    $pattern = array(
    "/\[url\](.*?)\[\/url\]/",
    "/\[img\](.*?)\[\/img\]/",
    "/\[img\=(.*?)\](.*?)\[\/img\]/",
    "/\[url\=(.*?)\](.*?)\[\/url\]/",
    "/\[red\](.*?)\[\/red\]/",
    "/\[b\](.*?)\[\/b\]/",
    "/\[h(.*?)\](.*?)\[\/h(.*?)\]/",
    "/\[p\](.*?)\[\/p\]/",    
    "/\[php\](.*?)\[\/php\]/is"
    );

    $replacement = array(
    '<a href="\\1">\\1</a>',
    '<img alt="" src="\\1"/>',
    '<img alt="" class="\\1" src="\\2"/>',
    '<a rel="nofollow" target="_blank" href="\\1">\\2</a>',
    '<span style="color:#ff0000;">\\1</span>',
    '<span style="font-weight:bold;">\\1</span>',
    '<h\\1>\\2</h\\3>',
    '<p>\\1</p>',
    '<pre><code class="php">\\1</code></pre>'
    );

    $string = preg_replace($pattern, $replacement, $string);

    $string = nl2br($string);

    return $string;

}

...

echo parse("[h2]Lorem Ipsum[/h2][p]Dolor sit amet[/p]");

结果...

<h2>Lorem Ipsum</h2><p>Dolor sit amet</p>

enter image description here

或者只使用HTML Purifier:)

答案 3 :(得分:1)

HTML Purifier和htmLawed都很好。 htmLawed具有占地面积小,可配置性高的优点。除了执行平衡标签,过滤特定HTML标签或其属性或属性内容(通过白色或黑色列表)等标准工作外,它还允许使用自定义功能。

答案 4 :(得分:0)

使用 HTML Sanitizer API 很容易:

words = [['Hi'], ['From'], ['Python']]

with open('mypage.html', 'w') as myFile:
    myFile.write('<html>')
    myFile.write('<body>')
    myFile.write('<h1>---------------------------</h1>')

    
    # 2-depth string data to 1-depth 
    words = [word_str for inner in words for word_str in inner] 
    
    # use fstring to build string
    for word in words:
        myFile.write(f'<tr><td>{word}</td></tr>')  


    myFile.write('</body>')
    myFile.write('</html>')