14

HTML是否应该在存储到数据库之前进行编码?还是在输出到浏览器时进行编码是正常的做法?

我所有的基于文本的字段长度是否应该在数据库中增加四倍以允许额外的存储?

寻找最佳实践,而不是确定是或否:-)

4

5 回答 5

16

您的数据库中的数据真的是 HTML 吗,还是您碰巧知道的名称或评论之类的应用程序数据最终会成为 HTML 页面的一部分?

如果是应用程序数据,我认为最好:

  • 以环境原生的形式表示它(例如在数据库中未编码),以及
  • 确保它在跨越代表性边界时正确翻译(在生成 HTML 页面时进行编码)。

如果您是 MVC 的粉丝,这也有助于将视图/控制器与模型(以及持久存储格式)分开。

表示

例如,假设有人留下评论“我喜欢 M&Ms”。在代码中将其表示为纯文本 String 可能最容易"I love M&Ms",而不是 HTML 编码的 String "I love M&Ms"。从技术上讲,代码中存在的数据还不是 HTML,如果数据尽可能准确地表示,生活是最容易的。此数据稍后可能会在不同的视图中使用,例如桌面应用程序。这些数据可能存储在数据库、平面文件或 XML 文件中,以后可能会与另一个程序共享。其他程序最简单的假设字符串是格式的“本机”表示:"I love M&Ms"在数据库和平面文件以及"I love M&Ms"XML 文件中。"I love &Ms"看到在 XML 文件 ( )中编码的 HTML 编码值,我会感到畏缩。

翻译

稍后,当数据即将跨越表示边界(例如以 HTML 显示、存储在数据库、纯文本文件或 XML 文件中)时,确保正确翻译以使其在下一个环境的原生格式。简而言之,当您将其显示在 HTML 页面上时,请确保将其翻译为正确编码的 HTML(手动或通过工具),以便该值准确地显示在页面上。当您将其存储在数据库中或在查询中使用它时,请使用转义和/或准备好的语句和绑定变量来确保将相同的概念值准确地表示到数据库中。当您将其存储在 XML 文件中时,您确保它是 XML 编码的。

跨越表示边界时未能正确转换是注入攻击的来源,例如 SQL 注入攻击。每当您使用多种表示/语言(例如 Java、SQL、HTML、Javascript、XML 等)时,请注意这一点。

--

另一方面,如果您真的想将 HTML 页面片段保存到数据库中,那么我不清楚您所说的“在存储前编码”是什么意思。如果它是严格有效的 HTML,则所有必要的值都应该已经被编码(例如&<等)。

于 2010-04-11T14:04:46.683 回答
13

做法是在显示之前进行 HTML 编码。

如果您在显示之前对编码保持一致,那么您已经做了很好的XSS预防。

您应该将原始表单保存在数据库中。这保留了原始版本,您可能希望对其进行其他处理而不是对编码版本进行处理。

于 2010-04-11T08:04:12.467 回答
2

数据库供应商特定的输入转义,html 输出转义。

于 2010-04-11T14:20:56.910 回答
1

我不同意所有认为应该在显示时对其进行解码的人的观点,如果在到达数据库之前对其进行编码,则只有在开发人员在显示之前对其进行解码时,才有可能发生攻击。但是,如果您在呈现之前对其进行解码,则其他新手开发人员总是有可能发生这种情况,例如新员工或糟糕的实现。如果它坐在那里未编码,它只是等待在互联网上弹出并像疱疹一样传播。丢失原始数据不应该是一个问题。编码 + 解码每次都应该产生相同的数据。只是我的两分钱。

于 2013-03-15T22:37:11.753 回答
-1

出于安全原因,是的,您应该首先将 html 转换为其实体,然后插入数据库。当您允许用户(或者更确切地说是坏人)使用 html 标签然后您将它们处理/插入到数据库中时,就会发起诸如XSS之类的攻击。XSS 是大多数安全漏洞的根本原因之一。所以你肯定需要在存储之前对你的 html 进行编码。

于 2010-04-11T08:02:50.483 回答