我想知道我应该采取以下哪种方式。我正在使用微小的MCE wysiwyg编辑器,它使用正确的html标签格式化用户数据。现在,我需要将输入编辑器的数据保存到数据库表中。
我应该在插入数据库时将html标签编码为相应的实体,然后当我从表中获取数据时,没有将其编码用于XSS目的但是我仍然需要使用eval来表示html用于格式化文本的标签。
OR
我是否将html标签保存到数据库中,然后当我从数据库中获取数据时将html标签编码为其实体,但随后标签将显示给用户,我必须使用eval用于在输入数据时实际格式化数据。
我的想法是第一种选择,我只是想知道你们的想法。
答案 0 :(得分:4)
我建议将数据存储在数据库中尽可能接近它的“自然”形式。通常,您的数据库层不应关心字段是包含HTML,Base64编码二进制文本还是纯文本。在决定如何呈现内容时,这些是您的视图层的问题。
因此,虽然您可能希望在插入数据库之前对XSS攻击进行一些初步筛选,但在向浏览器发送“不受信任”信息之前,应始终先筛选XSS。
这样做的另一个好处是,如果您的XSS预防算法在未来得到改进,您只需更改显示它的例程就可以在整个应用程序中实现它,而不必扫描数据库中可能包含HTML的字段,然后更新它们。
答案 1 :(得分:3)
都不是。您将HTML“按原样”存储,以便将其拉出准备渲染时。你不可能来回转换。你放入的东西应该是你展示的东西。您要做的是在将输入放入数据库之前过滤输入。 tinyMCE和ck / fckEditor都有限制可以在编辑器中使用的标签的工具,它会为你剥离这些标签。然后你需要执行任何其他必要的验证或格式化。
答案 2 :(得分:2)
当我第一次开始我的博客时,我决定将BBCode转换为HTML(并进行健全性检查),然后将其放入数据库中。好吧,一个月滚动,结果我有一个布局问题。既然我的旧HTML已在数据库中“修复”,我很快就知道你应该始终存储用户在数据库中使用的初始文本,然后在请求中将其转换。
这使得您可以使用HTML和XSS修复错误,并且具有追溯力。
答案 3 :(得分:1)
我只是在插入数据库时检查SQL注入,并将html保留为原始状态。
我知道drupal会这样做并且在运行中应用过滤器(例如,所有html标签(无过滤器),仅某些标签,xss过滤器,php代码格式,令牌等)。这种方法的一个优点是,如果您想要更改以后使用的过滤器,则不会破坏性地修改输入数据。
答案 4 :(得分:0)
一种可能性是存储两者已清理的版本和原始版本。我在HTMLPurifier中使用它来避免实时清理所产生的性能问题,同时仍允许用户以原始格式编辑其内容。
毋庸置疑,它将占用存储空间的两倍,但通常空间并不像速度和控制那么大。