我目前有一个简单的 <div contenteditable="true">
工作,但是,这是我的问题。
目前,用户可以通过插入 <script>
来创建持久性 XSS。进入 div,我绝对不想要。
但是,我目前解决这个问题的想法是:
- 只允许 a 和 img 标签
- 使用文本区域(这不是个好主意,因为那样会让用户复制和粘贴图像)
你们有什么建议?
最佳答案
您必须记住,要防止 xss,您必须在服务器端执行此操作。如果您的富文本编辑器(例如 YUI 或 tinyMCE)有一些 javascript 来防止输入脚本标签,那不会阻止我检查您的 http post 请求,查看您正在使用的变量名称,然后使用 firefox海报将我喜欢的任何字符串发送到您的服务器以绕过所有客户端验证。如果您不验证用户输入的服务器端,那么您几乎没有做任何有成效的事情来防止 XSS。
任何客户端 xss 保护都与您呈现用户输入的方式有关;不是你如何接收它。因此,例如,如果您对所有输入进行编码,则它不会呈现为 html。这偏离了你想要完成的事情(只是 anchor 和 img 标签)。请记住,允许呈现的内容越多,暴露的漏洞就越多。
话虽这么说,你的大部分保护应该来自服务器端,并且有很多 XSS 过滤器,具体取决于你编写的内容(例如,asp.net 或 tomcat/derby/jboss)可以看看。
我认为您只允许 a 和 img 标签是正确的。您必须记住的一件事是,您可以将 javascript 命令放入标签的 src 属性中,因此请注意验证 href 属性。但是“什么都不允许,然后将过滤器更改为只允许某些东西”(又名白名单过滤)的基本思想比“允许所有东西然后过滤掉我不想要的东西”(又名黑名单过滤)要好。
在下面的评论中,Brian Nickel还说了这个就说明了一点:
Everything but the elements and attributes you want to keep. I know you mentioned it in your answer but that bears repeating since it is so scary.
<img onerror="stealMoney()">
您要做的另一件事是定义一个 XSSFilterRequest 对象(或类似的东西)并在过滤器中覆盖您的请求,以便对任何“getUrlParameter”和“getRequestParameter”对象的任何调用都运行通过您的 xss 过滤器的请求值。这提供了一种无需重写现有代码即可过滤所有内容的简洁方法。
编辑:xss 过滤的 python 示例:
关于javascript - div contenteditable,XSS,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/8086847/