私は自分のUI(JavaベースのWebアプリケーション用)にユーザーが任意の値を入力できるHTMLテキストエリアを持っています。保存されると、ブラウザのテキストエリア(無効になっている)に表示されます。スクリプトがHTMLテキストエリアに表示されている場合、XSS攻撃は可能ですか?
ユーザがテキストエリアにフリーテキストとしてスクリプトを入力した場合、スクリプトとして実行されます(たとえ値がテキスト/テキストではなくテキストエリアに表示されていても)。
私は自分のUI(JavaベースのWebアプリケーション用)にユーザーが任意の値を入力できるHTMLテキストエリアを持っています。保存されると、ブラウザのテキストエリア(無効になっている)に表示されます。スクリプトがHTMLテキストエリアに表示されている場合、XSS攻撃は可能ですか?
ユーザがテキストエリアにフリーテキストとしてスクリプトを入力した場合、スクリプトとして実行されます(たとえ値がテキスト/テキストではなくテキストエリアに表示されていても)。
これは、textarea
の値の設定方法によって異なります。 HTMLコードでは、textarea
の内容は要素内のテキストです。
私は、これは内部のスクリプト(保存)し、空の1と2つのtextarea
の要素を作成しますtextarea
<div><textarea id="e1"></textarea></div>
<div><textarea id="e2"></textarea></div>
<div id="e3"/>
var dangerous = '<scri' + 'pt>alert("Danger!");</scri' + 'pt>';
document.getElementById('e1').value = dangerous;
document.getElementById('e2').innerHTML = dangerous;
dangerous = '</textarea>' + dangerous;
var content = '<textarea>' + dangerous + '</textarea>';
document.getElementById('e3').innerHTML = content;
console.log('Done.');
の内容を変更するにはJSFiddle to demonstrateさまざまな方法を作成しました。
最後のテストでは、入力内のtextarea
を閉じて、スクリプトを追加します。 興味深いことに、この場合はinnerHTML
を設定しても安全です。It doesn't execute scripts inserted in this way。
JavaScriptで行う限り、あなたはかなり安全です。しかし、通常、サーバー上のページのDOMをレンダリングして、あなたはあなたが適切のでtextarea
の内容をエスケープすることを確認する必要があります。
String unfilteredInput = "</textarea><script>alert(\"Danger!\");</script>";
out.write("<textarea>");
out.write(content);
out.write("</textarea>");
スクリプトを実行します。
注:私もdocument.write()
を実証しようとしましたが、これはJSFiddleでは許可されていません。 document.write()
は同じ攻撃に対して脆弱だと私は確信しています。
+1はい、 'document.write()'も脆弱であるということは間違いありませんが、サーバー側とクライアント側のどちらが設定されているかによって異なります。ここでの簡単な例:https://dl.dropboxusercontent.com/u/1075151/dwrite.htm(Chromeで動作) – SilverlightFox
あなたのコードを見てみましょう。 –