6

UI (Java ベースの Web アプリ用) に、ユーザーが任意の値を入力できる HTML テキストエリアがあります。保存すると、ブラウザのテキストエリア (無効になっています) に表示されます。

ユーザーが任意のスクリプトをテキストエリアにフリー テキストとして入力した場合、それはスクリプトとして実行されますか (ラベル/テキストではなくテキストエリアに値が表示されていても)?

4

1 に答える 1

5

それは、の値をどのように設定するかによって異なります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()同じ攻撃に対して脆弱であると確信しています。

于 2013-10-30T08:23:32.443 に答える