【问题标题】:Best practice. Do I save html tags in DB or store the html entity value?最佳实践。我是在数据库中保存 html 标签还是存储 html 实体值?
【发布时间】:2010-05-05 22:43:40
【问题描述】:

我想知道我应该以哪种方式执行以下操作。我正在使用微型 MCE 所见即所得编辑器,它使用正确的 html 标签格式化用户数据。现在,我需要将输入到编辑器中的数据保存到数据库表中。

我是否应该在插入数据库时​​将 html 标签编码为它们对应的实体,然后当我从表中取回数据时,没有为 XSS 目的对其进行编码,但我仍然必须对 html 使用 eval标签来格式化文本。

我是否将 html 标签保存到数据库中,然后当我从数据库中取回数据时,将 html 标签编码为它们的实体,但是当标签出现在用户面前时,我必须使用 eval函数在输入数据时实际格式化数据。

我的想法是第一个选项,我只是想知道你们的想法。

【问题讨论】:

    标签: php encoding xss html-entities


    【解决方案1】:

    我建议以尽可能接近其“自然”形式的方式将数据存储在数据库中。通常,您的数据库层不应该关心字段是否包含 HTML、Base64 编码的二进制文本或仅包含纯文本。这些是您的视图层在决定如何呈现内容时所关心的问题。

    因此,虽然您可能希望在插入数据库之前对 XSS 攻击进行一些初步筛选,但您应该始终在向浏览器发送“不受信任”信息之前筛选 XSS。

    这还有一个好处是,如果您的 XSS 预防算法在未来有所改进,您只需更改显示它的例程即可在整个应用程序中实现它,而不必扫描您的数据库中可能包含 HTML 的字段,然后更新它们。

    【讨论】:

    • 另外,请考虑是否需要发送纯文本电子邮件或以其他方式查看数据。如果您的数据库被规范化为您的 HTML 视图,那么其他转换可能会很尴尬,您会一直想知道它在哪种编码中。如果性能是一个问题,您的视图总是可以进行缓存。
    【解决方案2】:

    两者都没有。您“按原样”存储 HTML,因此当您将其拉出时,它就可以进行渲染了。你不应该来回转换。你投入的应该是你展示的。您要做的是在将输入放入数据库之前对其进行过滤。 tinyMCE 和 ck/fckEditor 都具有限制可在编辑器中使用的标签的功能,它会为您去除这些标签。然后您只需要执行任何其他必要的验证或格式化。

    【讨论】:

    • 当您说“过滤输入”时,您能澄清一下您的意思吗?
    • 我想让我的应用程序尽可能安全,并认为通过使用 htmlentities 函数将标签转换为它们的 html 实体将是使其更安全的一步。
    • @matt: 在你想要删除禁止标签、纠正无效标记等的路上。然后在他离开的路上你可能会应用过滤器来执行转换、额外的 xss 过滤等。之前其显示。但是您希望数据库中的内容成为 Adam N、brian_d 和 Earlz 在他们的答案中建议的基线标记。
    【解决方案3】:

    当我第一次开始写博客时,我决定将 BBCode 转换为 HTML(并进行完整性检查),然后将其放入数据库中。好吧,一个月过去了,结果我遇到了布局问题。既然我的旧 HTML 在数据库中“固定”了,我很快就知道您应该始终将用户使用的初始文本存储在数据库中,然后在稍后的请求中转换它。

    这样您就可以修复 HTML 和 XSS 的错误,并且可以追溯。

    【讨论】:

      【解决方案4】:

      我只会在插入数据库时​​检查 SQL 注入,然后将 html 保留为“原始”形式。

      我知道drupal 会这样做并即时应用过滤器(例如,所有html 标签(无过滤器)、仅某些标签、xss 过滤器、php 代码格式、令牌等)。这种方法的一个优点是,如果您想更改稍后使用的过滤器,您不会破坏性地修改您的输入数据。

      【讨论】:

        【解决方案5】:

        一种可能性是存储净化版本和原始版本。我将它与 HTMLPurifier 一起使用以避免实时清理造成的性能问题,同时仍允许用户以原始形式编辑其内容。

        不用说它会占用两倍的存储空间,但通常空间并不像速度和控制那么重要。

        【讨论】:

          猜你喜欢
          • 2011-03-31
          • 2015-11-05
          • 2019-06-05
          • 1970-01-01
          • 1970-01-01
          • 2010-10-27
          • 2011-03-23
          • 1970-01-01
          • 2013-08-03
          相关资源
          最近更新 更多