在 Web 应用程序中使用富文本的最佳实践是什么?我不想让自己容易受到脚本攻击。数据是否应该被编码进入数据库,然后在显示给用户时解码?关于处理诸如删除脚本标签或编码输入标记之类的富文本编辑器的任何建议?
2 回答
您应该选择一个已知标签和属性的白名单,将用户输入解析为 XML,并删除不在白名单中的每个标签或属性。
编辑:请注意,如果您允许超链接或图像,则必须验证src
andhref
标记。我建议使用 解析它System.Uri
,将方案限制为http
,也许还有您网站的域(取决于您希望用户能够做什么)。
以前也做过类似的事情;谷歌他们。
编辑:例如,看到这个问题
第二次编辑:
在将数据放入数据库之前,您不应对其进行编码。只要您使用参数(如果您不使用,您确实应该使用),数据库将完全不受您放入其中的任何内容的影响。
如果您的输入清理是安全的(见上文),那么如果您对其进行编码并在途中对其进行解码,则不会有任何区别,如果清理不安全,则对其进行编码将无济于事。
但是,通过标准 XML 解析器运行它可能是个好主意,拒绝任何不解析的输入,并使用解析器中的格式化 XML(如上所述)
第三次编辑:
那里有很多富文本编辑器。对于 MVC,我想我会推荐FCKEditor。它会为您转义输入,但您不能完全依赖它,因为攻击者可以禁用 JavaScript 或伪造他自己的 HTTP 请求。(您仍然需要验证服务器上的 HTML)。有许多用于 Web 表单的富编辑器(我假设它们会进行服务器端验证);MVC 还没有(还)
最好的选择是对发送给用户的数据进行编码,而不是在数据库中对其进行编码。据我所知,asp.net 通过验证输入来防止脚本攻击。