【问题标题】:Cleaning an HTML string saving some tags and attributes清理 HTML 字符串以保存一些标签和属性
【发布时间】:2011-04-08 08:01:20
【问题描述】:

在我实现我的清理功能后(根据要求的细节),我的老板决定更改接受的输入。现在他想保留一些特定的标签及其属性。我建议实现一种类似 BBCode 的语言,这种语言更安全,恕我直言,但他不想这样做,因为它会做很多工作。

这次我想保持简单,这样下次他要求我再次改变这个东西时,我就不会杀了他。我知道他会的。

先使用strip_tags和tag参数保存然后htmlentities就够了吗?

【问题讨论】:

    标签: php html-sanitizing


    【解决方案1】:

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

    该 sn-p 将删除除 pa 之外的所有标签。为您允许的标签保留属性(上例中为pa)。

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

    【讨论】:

    • 不,没有关于保留什么属性的具体要求。实际上我打算使用htmlentities 来将数据存储在数据库中。
    • @dierre:HTML 编码只是一个输出阶段的问题。不要用编码数据污染您的数据库,这会使搜索、使用数据库字符串操作和在非 HTML 上下文中使用变得困难。 HTML 编码,在输出阶段使用htmlspecialchars(),将文本放入 HTML,而不是之前。
    • @dierre:不要使用htmlentities 进行存储。使用mysql_real_escape 或类似名称。此外,htmlentities 可能会破坏某些属性,因此请尝试使用它。但是,您仍然想转义这些属性,所以一些 wiseguy 不能这样做:<img src="javascript: alert ('pwned');"/>。我会查看下面提供的链接@bobince。
    【解决方案2】:

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

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

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

    【讨论】:

    • 是的,例如如果它们位于允许标记的属性中,我们将调用 javascript 函数。 +1 链接到 htmlpurifier。我去看看。
    猜你喜欢
    • 2011-05-04
    • 2017-07-29
    • 2015-01-23
    • 2019-03-20
    • 1970-01-01
    • 2015-12-26
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多