HTML应该存储在数据库之前吗?或者通常的做法是在浏览器的路上进行编码?
我的所有基于文本的字段长度是否应该在数据库中翻两番以允许额外的存储空间?
寻找最佳实践,而不是坚实的是或否:-)
您数据库中的数据是否真的是HTML,或者您刚才知道的应用程序数据(如名称或注释)最终会成为HTML页面的一部分吗?
如果是应用程序数据,我认为最好:
以环境本身的形式表示它(例如,在数据库中未编码),以及
确保它在跨越表示边界时正确翻译(在生成HTML页面时进行编码).
如果您是MVC的粉丝,这也有助于将视图/控制器与模型(以及持久存储格式)分开.
表示
例如,假设有人留下评论"我爱M&Ms".它可能最容易在代码中表示为纯文本字符串"I love M&Ms"
,而不是HTML编码的字符串"I love M&Ms"
.从技术上讲,代码中存在的数据还不是HTML,如果数据的表示尽可能准确,则生活最简单.此数据可能稍后用于不同的视图,例如桌面应用程序.该数据可以存储在数据库,平面文件或XML文件中,稍后可能与另一个程序共享.对于其他程序来说,最简单的假设字符串是格式的"本机"表示:"I love M&Ms"
在数据库和平面文件以及"I love M&Ms"
XML文件中.我会畏缩地看到在XML文件中编码的HTML编码值("I love &Ms"
).
翻译
之后,当数据即将跨越表示边界(例如,以HTML格式显示,存储在数据库中,纯文本文件或XML文件中)时,确保其正确转换以便在数据中准确表示格式原生于下一个环境.简而言之,当您在HTML页面上显示它时,请确保将其翻译为正确编码的HTML(手动或通过工具),以便在页面上准确显示该值.当您将其存储在数据库中或在查询中使用它时,请使用转义和/或预处理语句以及绑定变量来确保将相同的概念值准确地表示给数据库.当您将其存储在XML文件中时,您可以确保其以XML编码.
跨越表示边界时无法正确转换是SQL注入攻击等注入攻击的来源.每当您使用多种表示/语言(例如Java,SQL,HTML,Javascript,XML等)时,请认真对待它.
-
另一方面,如果您真的想将HTML页面片段保存到数据库中,那么我不清楚"存储前编码"的含义.如果它是严格有效的HTML,所有必要的值应该已经进行编码(如&
,<
等).
实践是在显示之前进行HTML编码.
如果您在显示之前对编码保持一致,那么您已经做了很多XSS
预防.
您应该将原始表单保存在数据库中.这保留了原有的,您可能需要做其他的处理上是并没有对编码版本.