div contenteditable,XSS

时间:2011-11-10 21:50:52

标签: javascript jquery html xss

我目前有一个简单的<div contenteditable="true">工作,但是,这是我的问题。

目前,用户可以通过在div中插入<script>来创建持久性XSS,我绝对不想要。

但是,我目前解决此问题的想法是:

  • 仅允许使用a和img标记
  • 使用textarea(不是一个好主意,因为那时用户可以复制和粘贴图像)

你们有什么建议?

2 个答案:

答案 0 :(得分:8)

你必须记住,为了防止xss,你需要在服务器端做到这一点。如果您的富文本编辑器(前YUI或tinyMCE)有一些javascript来阻止输入脚本标记,这不会阻止我检查您的http发布请求,查看您正在使用的变量名称,然后使用Firefox海报将我喜欢的任何字符串发送到您的服务器,以绕过所有客户端验证。如果您没有验证用户输入SERVER SIDE,那么您几乎几乎没有任何效率来保护XSS。

任何客户端xss保护都与渲染用户输入的方式有关;不是你如何收到它。因此,例如,如果您对所有输入进行了编码,那么它就不会呈现为html。这远离你想要完成的事情(只是锚和img标签)。请记住,您允许渲染的漏洞越多,您所暴露的漏洞就越多。

据说你的大部分保护应该来自服务器端,并且有很多XSS过滤器,这取决于你所写的内容(例如,asp.net或tomcat / derby / jboss)你可以调查一下。

我认为你只允许一个和img标签走在正确的道路上。您必须记住的一件事是您可以将javascript命令放入标记的src属性中,因此请注意验证href属性。但是“允许任何事情然后改变过滤器以仅允许某些事情”(AKA白名单过滤)的基本思想比“允许所有内容然后过滤掉我不想要的东西”(AKA黑名单过滤)更好。

在下面的评论中,Brian Nickel也说明了这一点:

  

除了要保留的元素之外的所有内容。一世   知道你在答案中提到了它,但是从那以后就重复了   太可怕了。 <img onerror="stealMoney()">

你要做的另一件事是定义一个XSSFilterRequest对象(或者那些行中的东西)并在一个过滤器中覆盖你的请求,这样任何调用你的“getUrlParameter”和“getRequestParameter”对象都会运行请求值通过您的xss过滤器。这提供了一种干净的方法来过滤所有内容而无需重写现有代码。

编辑:xss过滤的一个python示例:

Python HTML sanitizer / scrubber / filter

Python library for XSS filtering?

答案 1 :(得分:0)

使用google caja(源代码转换器来保护基于Javascript的Web内容)怎么样?

除非您在服务器端进行了xss验证,否则可以将html_sanitize应用于从用户发送的数据和从要显示的服务器接收的数据。在最坏的情况下,您将在数据库中获得永远不会向用户显示的XSSed内容。