Php 最佳做法。我是将html标记保存在DB中还是存储html实体值?

Php 最佳做法。我是将html标记保存在DB中还是存储html实体值?,php,encoding,xss,html-entities,Php,Encoding,Xss,Html Entities,我想知道我该怎么做下面的事情。我正在使用微型MCE wysiwyg编辑器,它使用正确的html标记格式化用户数据。现在,我需要将输入编辑器的数据保存到数据库表中 我应该在插入数据库时将html标记编码到它们相应的实体中,然后当我从表中获取数据时,不需要出于XSS目的对其进行编码,但我仍然必须使用eval对html标记格式化文本 或 我是否将html标记保存到数据库中,然后当我从数据库获取数据时,将html标记编码到它们的实体中,但是当用户看到标记时,我必须使用eval函数来实际格式化输入的数据

我想知道我该怎么做下面的事情。我正在使用微型MCE wysiwyg编辑器,它使用正确的html标记格式化用户数据。现在,我需要将输入编辑器的数据保存到数据库表中

我应该在插入数据库时将html标记编码到它们相应的实体中,然后当我从表中获取数据时,不需要出于XSS目的对其进行编码,但我仍然必须使用eval对html标记格式化文本

我是否将html标记保存到数据库中,然后当我从数据库获取数据时,将html标记编码到它们的实体中,但是当用户看到标记时,我必须使用eval函数来实际格式化输入的数据


我的想法是第一种选择,我只是想知道你们的想法。

我建议将数据以尽可能接近“自然”的形式存储在数据库中。通常,数据库层不应该关心字段是包含HTML、Base64编码的二进制文本还是纯文本。这些都是视图层在决定如何渲染内容时需要考虑的问题

因此,虽然您可能希望在插入数据库之前对XSS攻击进行一些初步筛选,但在向浏览器发送“不受信任”的信息之前,您应该始终对XSS进行筛选


这还有一个好处,即如果将来XSS预防算法有所改进,您可以通过更改显示它的例程在整个应用程序中实现它,而不必扫描数据库中可能包含HTML的字段,然后进行更新。

。您将HTML“按原样”存储,这样当您将其拉出时,它就可以进行渲染了。你不能来回转换。你输入的应该是你显示的。您要做的是在将输入放入数据库之前对其进行过滤。tinyMCE和ck/fckEditor都有限制编辑器中可以使用的标记的功能,它将为您剥离这些标记。然后,您需要执行任何其他必要的验证或格式化。

在插入数据库时,我只需检查SQL注入,并保持html的“原始”形式不变


我知道drupal会这样做,并动态应用过滤器(例如,所有html标记(无过滤器)、仅某些标记、xss过滤器、php代码格式、标记等)。这种方法的一个优点是,如果您想更改以后使用的过滤器,您不会破坏性地修改输入数据。

当我第一次开始我的博客时,我决定将BBCode转换为HTML(并进行健全性检查),然后将其放入数据库中。一个月过去了,结果我遇到了一个布局问题。现在我的旧HTML在数据库中已经“固定”了,我很快就了解到,您应该始终将用户使用的初始文本存储在数据库中,然后在以后的请求中对其进行转换


这使得您可以用HTML和XSS修复bug,并且可以追溯

一种可能性是同时存储消毒版本和原始版本。我将其与HTMLPurifier一起使用,以避免实时清理造成的性能问题,同时仍然允许用户以原始形式编辑其内容


不用说,这将占用双倍的存储空间,但通常情况下,空间并不像速度和控制那么重要。

当你说“过滤输入”时,你能澄清一下你的意思吗?我想让我的应用程序尽可能安全,并认为通过使用htmlentities函数将标记转换为它们的html实体将是使其更安全的一步。@matt:在这一过程中,你想删除禁止的标记,纠正无效的标记,等等。。然后在退出时,您可以应用过滤器来执行转换、额外的xss过滤等。。在它显示之前。但是,你希望DB中有什么是Adam N、Brand和Erz提出的基线标记,也可以考虑是否需要发送纯文本电子邮件或者以其他方式查看数据。如果您的数据库被规范化为HTML视图,那么其他转换可能会很麻烦,您总是想知道它使用的是哪种编码。如果性能是一个问题,视图总是可以进行缓存。