清理HTML字符串,保存一些标签和属性

时间:2010-09-04 22:10:32

标签: php html-sanitizing

在我实施了消毒功能后(根据要求的具体情况),我的老板决定改变接受的输入。现在他想保留一些特定的标签及其属性。我建议实现一种类似BBCode的语言,这种语言更安全,但他不想这样做,因为它会有很多工作。

这次我想保持简单,所以下次他让我再次改变这件事时我不会杀了他。我知道他会。

首先使用带有tag参数的strip_tags来保留,然后使用htmlentities吗?

2 个答案:

答案 0 :(得分:2)

strip_tags并不一定会产生安全的内容。 strip_tags后跟htmlentities将是安全的,因为HTML编码的任何内容都是安全的,但它没有任何意义。

用户正在输入纯文本,在这种情况下应该使用htmlspecialchars(优先于htmlentities)输出,或者他们输入HTML标记,在这种情况下您需要解析它正确,修复损坏的标记并删除不在安全白名单中的元素/属性。

如果这是您想要的,请使用现有的库来执行此操作(例如htmlpurifier)。因为这不是一项微不足道的任务,如果你弄错了,你就给自己带来了XSS安全漏洞。

答案 1 :(得分:0)

您可以使用strip_tags语法保留特定代码:strip_tags($text, '<p><a>');

该代码段会删除除pa之外的所有代码。保留了您允许的标记的属性(上例中为pa)。

但是,这并不意味着属性是安全的。他是否需要特定属性,或者他是否希望将所有属性保留在允许的标签上?对于第一种情况,您需要解析每个标记并删除所需的标记,清理值。要将所有属性保留在允许的标记上,您仍需要对它们进行清理。我建议在属性值上运行htmlentities来清理它们(显示,我会假设)。