在存储或显示时对用户输入进行 HTML 编码
Posted
技术标签:
【中文标题】在存储或显示时对用户输入进行 HTML 编码【英文标题】:HTML encode user input when storing or when displaying 【发布时间】:2010-09-18 10:02:36 【问题描述】:一直困扰着我的简单问题。
我应该立即对用户输入进行 html 编码并将编码的内容存储在数据库中,还是应该在显示时存储原始值和 HTML 编码?
存储编码数据可大大降低开发人员在显示数据时忘记对数据进行编码的风险。但是,存储编码数据会使数据挖掘更加麻烦,并且会占用更多空间,尽管这通常不是问题。
【问题讨论】:
【参考方案1】:我强烈建议在退出时对信息进行编码。如果您希望更改在某个点查看原始数据的方式,则将原始数据存储在数据库中很有用。流程应该类似于:
sanitize user input -> protect against sql injection -> db -> encode for display
考虑一下您可能希望将信息显示为 RSS 提要的情况。在重新显示之前必须重做任何 HTML 特定编码似乎有点愚蠢。任何开发都应始终遵循“不信任输入”的模因,无论该输入来自用户还是来自数据库。
【讨论】:
当您执行 SELECT..WHERE 并且某些值具有 HTML 编码而其他值没有时,后续查询如何工作? 呃,听起来有点乱。这真的取决于你的具体情况,但如果我继承了一个需要创建新视图的项目,并且信息被编码了一半,我可能会重新存储未编码的信息,以便从长远来看让生活更轻松。 此外,如果您的显示编码过程很昂贵(例如,您允许 HTML 并在其上运行 HTML Purifier),则可以选择缓存过滤后的版本。磁盘空间很便宜。 @Ambush 指挥官:如果您接受 HTML,那么这是一个不同的问题:卫生,而不是转义。然后,您的输入是 HTML 格式,您无法选择(无损)存储为纯文本或 HTML。 区别是真的。但是,我看到太多开发人员采用有损方法并将过滤后的文本存储在他们的数据库中。【参考方案2】:请记住,您可能需要使用无法理解 HTML 编码文本的东西(例如,报告工具)来访问数据库。我同意空间不是问题,但恕我直言,将 HTML 编码放入数据库会将您的视图/前端的知识转移到应用程序的最低层,这是一个设计错误。
【讨论】:
同意!当 ppl 为防止 XSS 时,首先会忽略这一点。 你能看看我的related question吗?【参考方案3】:编码只能在显示中进行。无一例外。
【讨论】:
【参考方案4】:输出。
使用 HTML,您不能简单地检查字符串的长度(&
是 1 个字符,但 strlen()
会告诉您 5 个字符),您可以轻松裁剪它(它可能会破坏实体)。
您可能需要将来自数据库的字符串与来自其他来源的字符串混合,或者读取和写回它们。在应用程序范围内执行此操作而不会错过任何转义并避免双重转义是一场噩梦。
php 试图用magic_quotes
做类似的事情,结果却是一个巨大的失败。不要走magic_entities
路线! :)
【讨论】:
以上是关于在存储或显示时对用户输入进行 HTML 编码的主要内容,如果未能解决你的问题,请参考以下文章
在存储数据之前对其进行清理可能意味着存储的数据与用户输入的数据不同 - 这是常见的做法吗?