我从头开始构建了一个帧内编辑器。我正在尝试它的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而不执行?我在服务器端有一个清理程序来删除标记。
答案 0 :(得分: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);
});