UI (Java ベースの Web アプリ用) に、ユーザーが任意の値を入力できる HTML テキストエリアがあります。保存すると、ブラウザのテキストエリア (無効になっています) に表示されます。
ユーザーが任意のスクリプトをテキストエリアにフリー テキストとして入力した場合、それはスクリプトとして実行されますか (ラベル/テキストではなくテキストエリアに値が表示されていても)?
UI (Java ベースの Web アプリ用) に、ユーザーが任意の値を入力できる HTML テキストエリアがあります。保存すると、ブラウザのテキストエリア (無効になっています) に表示されます。
ユーザーが任意のスクリプトをテキストエリアにフリー テキストとして入力した場合、それはスクリプトとして実行されますか (ラベル/テキストではなくテキストエリアに値が表示されていても)?
それは、の値をどのように設定するかによって異なりますtextarea
。HTML コードでは、 のコンテンツはtextarea
要素内のテキストです。
のコンテンツを変更するさまざまな方法を示すために、JSFiddle を作成しました。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.');
これによりtextarea
、内部にスクリプトを含む (保存) 要素と空の要素を持つ 2 つの要素が作成されます。
最後のテストでtextarea
は、入力を閉じてスクリプトを追加しました。興味深いことにinnerHTML
、この場合、設定は安全に使用できます。この方法で挿入されたスクリプトは実行されません。
したがって、JavaScript で実行する限り、かなり安全です。textarea
ただし、通常は、サーバー上でページの DOM をレンダリングしてから、次の理由により、のコンテンツを適切にエスケープする必要があります。
String unfilteredInput = "</textarea><script>alert(\"Danger!\");</script>";
out.write("<textarea>");
out.write(content);
out.write("</textarea>");
スクリプトを実行します。
注: デモンストレーションも試みましたdocument.write()
が、JSFiddle では許可されていません。document.write()
同じ攻撃に対して脆弱であると確信しています。