2

$.html()我需要使用jquery将客户创建的内容从输入 textarea 插入div页面上的另一个以实现实时预览功能

但如果客户在内容中键入 javascript,例如:

<script type='text/javascript'>
alert('abc');
</script>

当用 调用这个时.html(),javascript 将被执行,如果我用.text(),那么内容将不会被视为 html。

我该如何解决这个问题?我为它创建了一个 jsfiddle:http: //jsfiddle.net/larryzhao/VL82f/

更新:也许我需要说得更清楚,我正在为降价做一个预览。所以用户在 textarea 上输入 markdown,我转换为 html,并显示到div#dest. 如果用户输入如上所示的脚本怎么办?有没有办法保留原始类型但不执行它?如果没有,那么我想我会写一个正则表达式来擦除我认为的脚本块..

我找到了两个在线降价工具: http ://daringfireball.net/projects/markdown/dingus 这个执行它 http://www.ctrlshift.net/project/markdowneditor/这个只是擦除脚本块

4

6 回答 6

1

如果用户输入的文本保留在客户端上,那么用户想要自己进行 XSS 攻击有什么关系呢?如果文本返回到服务器,那么你会在那里对其进行清理,这样如果其他用户看到输入,他们就会看到清理后的输入。

于 2012-09-07T04:26:40.583 回答
1

是否有用于 JavaScript 的 HTML 净化器?如果是这样,这就是这样做的方法。需要注意的是,这很难正确地做到,所以一个简单的正则表达式通常是不够的。如果您通过应用程序将其保存在某处,则预览功能可以通过发布和取回清理后的版本来利用该消毒剂。

于 2012-09-07T04:16:29.143 回答
1

您可以将脚本标签替换为其他内容,以便仅在预览中看到警报值,例如:

$(document).ready(function() {
    $('#source').on('keydown', function(){
       var content = ($(this).val()).replace(/(<\s*\/?\s*)script(\s*([^>]*)?\s*>)/gi ,'$1jscript$2')
        console.log( content );
        $("#dest").html( content );
    });
});

参见:jsFiddle

于 2012-09-07T04:20:19.117 回答
0

您可以清理用户输入,删除 xss。

请参阅节点验证器

于 2012-09-07T04:21:11.577 回答
0

为什么不定位 a<script>...</script>并转义代码部分中的字符?

例如:

<script src="test/javascript>
var userInput=document.getElementByID("#input");
..
..
..
</script>


&lt;script src=&quot;test/javascript&gt;
var userInput=document.getElementByID(&quot;#input&quot;);
..
..
..
&lt;/script&gt;
于 2012-09-07T04:52:24.043 回答
-1

您必须创建一个正则表达式才能不在<script>预览中插入:

<script (.|\n)*?>(.|\n)*?</script>

或尝试一下:

function stripScripts(s) {
  var div = document.createElement('div');
  div.innerHTML = s;
  var scripts = div.getElementsByTagName('script');
  var i = scripts.length;
  while (i--) {
    scripts[i].parentNode.removeChild(scripts[i]);
  }
  return div.innerHTML;
}

alert(
  stripScripts('<span><script type="text/javascript">alert(\'foo\');<\/script><\/span>')
);
于 2012-09-07T04:19:15.837 回答