将html实体存储在数据库中?或者在检索时转换?

时间:2009-12-28 18:36:51

标签: php mysql

快速提问,在将数据插入数据库之前或之后调用htmlentities()(或htmlspecialchars())更好吗?

之前:新的较长字符串将导致我必须更改数据库以在字段中保存更长的值。 (maxlength="800"可以更改为804字符串)

之后:这将需要更多的服务器处理,并且可以在每次页面加载或AJAX加载时对htmlspecialchars()进行数百次调用。

SOOO。检索结果时转换会显着减慢我的代码吗?我应该更换数据库吗?

8 个答案:

答案 0 :(得分:33)

我建议将最原始形式的数据存储在数据库中。在选择输出数据的方式和位置时,这为您提供了最大的灵活性。

如果您发现性能有问题,可以某种方式缓存此数据的HTML格式版本。请记住,过早优化是一件坏事。

答案 1 :(得分:11)

我没有PHP的经验但通常我总是转换或逃离最接近输出。您不知道输出要求何时会发生变化,例如您可能希望将数据作为XML或JSON数组吐出,因此转换为HTML然后存储意味着您仅限于将数据用作HTML。

答案 2 :(得分:7)

在php / MySQL网络应用程序中,数据以两种方式流动

数据库 - >脚本语言(php) - > HTML输出 - >浏览器 - >屏幕 和 键盘 - >浏览器的> $ _POST - > php - > SQL语句 - >数据库。

数据定义为用户提供的所有内容。

始终总是......

A)在将数据移入SQL语句时通过mysql_real_escape_string处理数据,并且

B)将htmlspecialchars移动到HTML输出中时处理数据。

这将保护您免受SQL注入攻击,并使html字符和实体正确显示(除非您设法忘记一个地方,然后您已经打开了一个安全漏洞)。

我是否提到必须对任何用户可能通过脚本触摸,更改或提供的每一条数据进行此操作?

P.S。出于性能原因,请在任何地方使用UTF-8编码。

答案 3 :(得分:3)

最好将文本存储为原始文本并根据需要对其进行编码,老实说,当您将数据输出到wbe页面时,总是需要对数据进行htmlencode以防止XSS黑客攻击。

在将数据放入数据库之前,不应对数据进行编码。主要原因是:

  1. 如果此类数据接近列大小限制,例如32个字符,如果标题是“Steve& Fred blah blah”,那么您可能会超过该列限制,因为1个char&成为一个5 char&安培;
  2. 您假设数据将始终显示在网页中,将来您永远不知道您将在何处查看数据并且您可能不希望它被编码,现在您必须对其进行解码并且您可以可能无法访问PHP的解码功能

答案 4 :(得分:2)

这是工匠“两次测量,优化一次”的方式。

答案 5 :(得分:2)

如果您的网站不需要高性能,请将其存储为原始数据,输出时请按照您的要求进行操作。
如果您需要性能,请考虑将其存储两次:使用原始数据执行所需操作,使用过滤数据执行另一个字段。它可能被视为冗余,但CPU价格昂贵,而数据存储非常便宜。

答案 6 :(得分:1)

最简单的方法是“按原样”存储数据,然后在需要的地方转换为htmlentities。

最安全的解决方案是在数据进入数据库之前对其进行过滤,因为这样可以防止可能因缺少安全性而对服务器和数据库造成的攻击,然后根据需要进行转换。此外,如果您使用的是PDO,则会自动为您使用预准备语句。

http://php.net/PDO

答案 7 :(得分:-5)

我们最近在工作中进行了辩论。我们决定将转义的值存储在数据库中,因为在之前(当我们将其转换为非转义时),有一些极端情况显示数据而不进行转义。这可能会导致XSS。因此,我们决定将其存储为安全存储,如果您它未转义,则必须自己完成工作。

编辑:所以对于不同意的人,让我为我的案例添加一些背景故事。假设您在一个由50多人组成的团队中工作......数据库中的数据不能保证在出路时进行HTML编码 - 没有内置机制,因此开发人员必须编写代码去做吧。而且这些数据遍布整个地方所以它不经过一个开发人员的代码,它经历了30年代 - 大多数人都不知道这些数据(或者它甚至可能包含罕见的尖括号)而只是想得到它显示在页面上,继续前进,并忘记它。

仍然认为最好将HTML中的数据放入数据库并依赖随机的人 - 你不能正确地做事吗?因为坦率地说,虽然它看起来似乎并不温暖 - 模糊 - 最佳实践,但我更喜欢失败关闭(意味着数据在Word Doc中出现时看起来像Value& lt; Stock而不是Value< Stock)而不是打开(因此Word Doc看起来没有任何工作,但平台的某些角落可能/可能 - 容易受到XSS的影响)。你不能兼得。