2

ライブプレビュー機能のために、$.html()jqueryを使用して入力テキストエリアからページ上の別のテキストエリアに顧客が作成したコンテンツを挿入する必要がありますdiv

しかし、顧客がコンテンツ内にjavascriptを入力した場合、次のようになります。

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

これをで呼び出すと.html()、javascriptが実行され、を使用する.text()と、コンテンツはhtmlとは見なされません。

どうすればこれを修正できますか?私はそれのためにjsfiddleを作成しました:http://jsfiddle.net/larryzhao/VL82f/

更新:たぶん私はそれをより明確にする必要があります、私はマークダウンのプレビューをしています。そこで、ユーザーはテキストエリアにマークダウンを入力し、htmlに変換して、に表示しますdiv#dest。ユーザーが上記のようにスクリプトを入力した場合はどうなりますか?元のタイプを保持するが実行しない方法はありますか?そうでない場合は、スクリプトブロックを消去するために正規表現を作成するだけだと思います。

私は2つのオンラインマークダウンツールを見つけました:http: //daringfireball.net/projects/markdown/dingus これはそれを実行し ますhttp://www.ctrlshift.net/project/markdowneditor/そしてこれはスクリプトブロックを一掃するだけです

4

6 に答える 6

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 に答える
1

ユーザーが入力したテキストがクライアントに残っている場合、ユーザーが自分でXSSを実行したいのであれば、なぜ重要なのですか?また、テキストがサーバーに戻った場合は、そこでサニタイズして、他のユーザーに入力が表示された場合に、クリーンアップされた入力が表示されるようにします。

于 2012-09-07T04:26:40.583 に答える
0

ユーザー入力をサニタイズし、xssを削除できます。

node-validatorを参照してください

于 2012-09-07T04:21:11.577 に答える
0

<script>...</script>コードのセクションでaを見つけて、文字をエスケープしてみませんか?

例えば:

<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 に答える