HTML是否应该存储在数据库之前进行编码?或者通常的做法是在出口到浏览器的过程中进行编码?
我的所有基于文本的字段长度是否应该在数据库中翻两番以允许额外存储?
寻找最佳实践而不是坚定的是或否: - )
答案 0 :(得分:15)
您的数据库中的数据是否真的是HTML,或者您刚才知道的应用程序数据(例如名称或注释)是否会最终成为HTML页面的一部分?
如果是应用程序数据,我认为最好:
如果您是MVC的粉丝,这也有助于将视图/控制器与模型(以及持久存储格式)分开。
<强>表示强>
例如,假设有人留下评论“我爱M&amp; Ms”。最简单的方法是在代码中将其表示为纯文本字符串"I love M&Ms"
,而不是HTML编码的字符串"I love M&Ms"
。从技术上讲,代码中存在的数据还不是HTML,如果数据的表示尽可能准确,则生活最简单。该数据可以稍后用于不同的视图,例如,桌面应用。该数据可以存储在数据库,平面文件或XML文件中,稍后可能与另一个程序共享。对于其他程序来说,最简单的假设字符串是格式的“本机”表示形式:数据库和平面文件中的"I love M&Ms"
以及XML文件中的"I love M&Ms"
。我会畏缩地看到HTML编码的值在XML文件("I love &amp;Ms"
)中编码。
<强>翻译强>
稍后,当数据即将跨越表示边界(例如,以HTML格式显示,存储在数据库,纯文本文件或XML文件中)时,确保它的重要性正确翻译,以便以下一个环境的原生格式准确表示。简而言之,当您在HTML页面上显示它时,请确保将其翻译为正确编码的HTML(手动或通过工具),以便在页面上准确显示该值。当您将其存储在数据库中或在查询中使用它时,请使用转义和/或预处理语句以及绑定变量来确保将相同的概念值准确地表示给数据库。当您将其存储在XML文件中时,您可以确保其使用XML编码。
跨越表示边界时无法正确转换是SQL注入攻击等注入攻击的来源。每当您使用多种表示/语言(例如Java,SQL,HTML,Javascript,XML等)时,请认真考虑。
-
另一方面,如果您真的想将HTML页面片段保存到数据库中,那么我不清楚“存储前编码”的含义。如果它是严格有效的HTML,则应该已经编码了所有必需的值(例如&
,<
等。)
答案 1 :(得分:13)
实践是在显示之前进行HTML编码。
如果您在显示之前对编码保持一致,那么您已经做了很多XSS
预防。
您应该将原始表单保存在数据库中。这保留了原始内容,您可能希望对 进行其他处理,而不是对编码版本进行处理。
答案 2 :(得分:2)
数据库供应商特定的输入转义,html在输出上转义。
答案 3 :(得分:1)
我不同意那些认为应该在显示时解码的人,只有在开发人员在显示之前对其进行解码时,才能在攻击到达数据库之前进行编码。但是,如果您在呈现它之前对其进行解码,那么其他新手开发人员可能会发生这种情况,例如新员工或不良实施。如果它坐在那里没有编码它只是等着在互联网上弹出并像疱疹一样传播。丢失原始数据不应该是一个问题。 encode + decode应该每次产生相同的数据。只是我的两分钱。
答案 4 :(得分:0)
出于安全原因,是的,您应首先将html转换为其实体,然后插入数据库。当您允许用户(或者更坏的人)使用html标签然后处理/插入数据库时,会启动 XSS 等攻击。 XSS是大多数安全漏洞的根本原因之一。所以你肯定需要在存储之前对你的html进行编码。