【问题标题】:using htmlpurifier for input or output escaping/filtering使用 htmlpurifier 进行输入或输出转义/过滤
【发布时间】:2011-02-23 06:11:50
【问题描述】:

我正在使用 javascript 所见即所得编辑器处理来自公众的用户输入,并且我计划使用 htmlpurifier 来清理文本。

我认为在输入上使用 htmlpurifier 就足够了,将清理后的输入存储在数据库中,然后在不进一步转义/过滤的情况下输出它。但是我听说过其他意见,您应该始终逃避输出。

如果我已经在清理输入,有人可以解释为什么我需要清理输出吗?

【问题讨论】:

    标签: php filtering io htmlpurifier


    【解决方案1】:

    我假设您的所见即所得编辑器生成 HTML,然后对其进行验证并放入数据库。在这种情况下,验证已经发生,因此无需验证两次。

    至于“转义输出”,那是另一回事。您无法转义生成的 HTML,否则您将没有格式化文本,并且标签将可见。当您不希望所述输出干扰页面的标记时,使用转义输出。

    我要补充的是,您必须非常小心您在验证阶段允许的内容。您可能只想允许一些 HTML 标记和属性。

    【讨论】:

    • 依赖 js 编辑器的问题是恶意用户可以绕过 js 的任何检查来提交帖子。
    • @Col - 是的 - 但 Artefacto 说 js “验证”了 html - 所以不需要验证两次(意思是使用 htmlpurifier)
    • 不,他是说你在读回数据库out的数据后不需要再次验证。
    • @Yehosef 我不是。您必须在提交之后(如果您愿意,使用 HTML Purifier)和在将其插入数据库之前验证它,而不是每次从数据库中获取它。
    • @artefacto - 感谢您的澄清和回答 - 我没有正确阅读它
    【解决方案2】:

    为了 100% 安全,请使用 HTMLPurifier 两次。在将 HTML 保存到数据库之前并将其输出到屏幕之前。
    这种解决方案的巨大缺点是性能。 HTMLPurifier 在过滤 HTML 时超慢,您可能会遇到页面处理时间较长的情况。

    如果您在将某些内容输出到屏幕之前只执行 1-2 次过滤应该没问题,但是如果您像我们一样对每个请求执行 10 次过滤,我们宁愿决定在输出大量要保留的文本时不使用 HTMLPurifier。

    HTMLPurifier 花费了每个请求 60% 的处理时间,而我们希望实现更短的响应时间和更高的用户体验。

    这取决于你的情况。如果您有能力在输出前使用 HTMLPurifier,那就去吧 - 它更好,而且您始终可以控制要允许的标签(对于存储在数据库中的新内容,甚至是旧内容)。

    【讨论】:

    • 感谢您的帖子 - 但您能解释一下我需要做两次的情况吗?例如,如果我这样做: $id = (int)$_POST['id']; $db->query("select * from users where id = ".int_val($id));我在安全方面有什么收获吗?
    • 第二次过滤(在输出之前)在有人入侵您的数据库服务器但没有设法闯入您的网络服务器的情况下很有帮助。攻击者可以轻松更改数据库中的任何内容,如果您在输出之前没有过滤 HTML,那么您将遇到非常严重的安全问题。不过我相信这是一种非常罕见的情况。
    • 我会说这是可笑的场景
    • 我同意,这种情况很少见,但是在输出之前过滤的副作用是,如果您决定不再允许某个标签(即 ),那么您的所有内容都非常简单.如果在输出之前没有过滤,则必须遍历每个条目并删除标签。
    【解决方案3】:

    口头禅总是逃避你的输出,这是一个文本到 HTML 的转换,是在网络空间工作时回退到的一个很好且合理的默认值。在 HTML Purifier 的情况下,您确实违反了这个好建议,因为您确实在执行 HTML 到 HTML 的转换,并且再次将 HTML 视为文本并没有真正意义。

    【讨论】:

    • 感谢您的回答,但我没有完全理解-您是说一旦使用 htmlpurifier,就可以将其视为安全?
    • 我认为这取决于上下文。如果您允许用户撰写博客文章,您可以使用 HTMLPurifier 来决定允许他们使用哪些标签。完成后,您需要将 HTML 输出为 HTML。您不想将其视为转义的文本,否则如果用户加粗一个单词,它将被转义并显示为 word。也许爱德华会回来确认我的评论。
    猜你喜欢
    • 2014-06-15
    • 2011-04-25
    • 1970-01-01
    • 1970-01-01
    • 2014-04-14
    • 1970-01-01
    • 2023-03-31
    • 2011-05-12
    • 2012-02-07
    相关资源
    最近更新 更多