4

我想知道我应该以哪种方式执行以下操作。我正在使用微型 MCE 所见即所得编辑器,它使用正确的 html 标签格式化用户数据。现在,我需要将输入到编辑器中的数据保存到数据库表中。

在插入数据库时​​,我是否应该将 html 标签编码为其对应的实体,然后当我从表中取回数据时,没有为 XSS 目的对其进行编码,但我仍然必须使用 eval 来格式化 html 标签文本。

或者

我是否将 html 标签保存到数据库中,然后当我从数据库中获取数据时,将 html 标签编码为它们的实体,但是随着标签将出现在用户面前,我必须使用 eval 函数来实际格式化输入的数据。

我的想法是第一个选项,我只是想知道你们的想法。

4

5 回答 5

4

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

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

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

于 2010-05-05T22:51:43.293 回答
3

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

于 2010-05-05T22:52:05.900 回答
2

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

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

于 2010-05-05T23:39:31.310 回答
1

我只是在插入数据库时​​检查 SQL 注入并将 html 保留为“原始”形式。

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

于 2010-05-05T23:03:55.243 回答
0

一种可能性是存储净化版本原始版本。我将它与 HTMLPurifier 一起使用来避免由实时清理产生的性能问题,同时仍然允许用户以原始形式编辑他们的内容。

不用说它会占用两倍的存储空间,但通常空间并不像速度和控制那么重要。

于 2010-05-06T00:17:00.437 回答