設定
最終的に必要なのは、コンボ ボックスとテキスト フィールドです。コンボ ボックスから項目を選択すると、テキスト フィールドに値が入力されます。コンボ ボックス内の項目は、ユーザー入力から取得されます。
これはうまく機能する私の現在のコードです:
function fill() {
var select = document.getElementById("select");
var value = select.options[select.selectedIndex].value;
var textfield = document.getElementById("textfield");
switch (value) {
case "1":
textfield.value = "some user-provided text";
break;
case "2":
textfield.value = "containing possibly < > & etc.";
break;
}
}
<select id="select" onchange="fill()">
<option>Select something...</option>
<option value="1">Select option 1</option>
<option value="2">Select option 2</option>
</select>
<input type="text" id="textfield"/>
問題
入力するユーザー提供のテキストに危険な文字が含まれている場合、どうすればよいかわかりません。通常は HTML コードに記述する前に HTML エンコードしますが、現在は JavaScript コードに記述しています。
JavaScript はすべて Java バックエンドによって生成されます。私は本当にこのようにそれを作成することはできません:
String value = getValueFromUser();
write("textfield.value = \"" + value + "\";");
このオプションを選択すると、誰かが入力"; somethingBad(); //
し、他のユーザーがsomethingBad()
実行されるためです。
値を HTML エンコードすると、次のようになります。
String value = htmlEncode(getValueFromUser());
write("textfield.value = \"" + value + "\";");
次に (セキュリティに関する質問は別として) コンボ ボックスで値を選択すると、テキスト フィールドに HTML エンコードされたテキストが入力されます。
質問
ユーザーが指定した値を次のようにエンコードするにはどうすればよいですか。
- JavaScript コード インジェクションに悪用されることはありません。
- テキストフィールドに入力された後、それらは同じように見えますか?