HTML输入的净化处理

8

我在考虑添加一个富文本编辑器,让非程序员也能够改变文本的样式。然而,问题是如果标记不正确,可能会扭曲渲染页面的布局。有没有一种良好的轻量级方法来清理HTML代码?

5个回答

20

你需要在优秀和轻量之间做出选择。推荐的选择是 'HTMLPurifier',因为它提供了易于使用、安全的默认设置。作为更快速的替代方案,通常建议使用 'htmLawed'。

此外,请参阅 HTMLPurifier 作者提供的这篇相当客观的概述:http://htmlpurifier.org/comparison


谢谢。我已经让HTMLPurifier正常运行了。虽然文档不太容易理解,但是我成功地将一些富文本转换成了最少量的文本,并适应了ISO字符集以避免删除重音符号。 - James P.
1
对于那些考虑使用 htmLawed 的人:首先看一下代码 - 你会哭的。目前没有比 HTMLPurifier 更好的选择。只是为了节省你的时间。 - ymakux
代码有什么问题吗?仅仅因为你不理解它并不意味着它是错误的。与HTMLPurifier相比,htmLawed更快、更小、更高效,值得考虑,而不是因为它没有按照你喜欢的方式编写。 - user594694
HTMLLawed 的作者似乎没有安全意识。该网站和论坛未使用 HTTPS,并且该网站敦促您禁用 Composer 的 secure-http,因为他懒得迁移到 HTTPS 或 Git 存储库。我不会信任那个人与安全相关的任何事情。 - DennisK

6
我非常喜欢HTML Purifier,它可以让你指定在你的HTML代码中允许使用哪些标签和属性,并且生成有效的HTML。

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>

输入图像描述

或者只需使用HTML Purifier :)


好的建议。不过我在想为什么点赞时会出现一只动画龙 :p 。 - James P.
7
为了使BBCode更加安全,您需要将其通过净化器(例如HTMLPurifier)运行。但实际上这是没有意义的。天真的BBCode容易遭受攻击:考虑使用上述解析器生成输入字符串[img]http://picture.of.a/pony.png" onload="execute(); arbitrary(); javascript();[/img]会产生什么结果。 - Lauren
1
肯定不适合公共使用,我完全忽略了安全方面,我以为它是用于私人使用的。@James P.,使用HTMLPurifier ;) - Dejan Marjanović

1

无论是HTML Purifier还是htmLawed都很好。 htmLawed 拥有更小的占用空间和更高的可配置性优势。除了做标签平衡、过滤特定的HTML标签或它们的属性或属性内容(通过白名单或黑名单等),它还允许使用自定义函数。


像 $GLOBALS['C'] = $C; 这样的好东西 - ymakux

0

使用HTML Sanitizer API很容易实现:

// our input string to clean
const stringToClean = 'Some text <b><i>with</i></b> <blink>tags</blink>, including a rogue script <script>alert(1)</script> def.';

const result = new Sanitizer().sanitizeToString(stringToClean);
console.log(result);
// Logs: "Some text <b><i>with</i></b> <blink>tags</blink>, including a rogue script def."

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接