0

設定

最終的に必要なのは、コンボ ボックスとテキスト フィールドです。コンボ ボックスから項目を選択すると、テキスト フィールドに値が入力されます。コンボ ボックス内の項目は、ユーザー入力から取得されます。

これはうまく機能する私の現在のコードです:

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 コード インジェクションに悪用されることはありません。
  • テキストフィールドに入力された後、それらは同じように見えますか?
4

3 に答える 3

2

自分の考えを入れさせてください。

私の Java コードは、ユーザーからの HTML エンコードされた入力を含む非表示の HTML 要素 (スパンなど) を生成します。

<span id="case1" class="hidden">some user-provided text</span>
<span id="case2" class="hidden">containing possibly &gt; &lt; &amp; etc.</span>

次に、私の JavaScript コードは次の値を使用します。

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 = document.getElementById("case1").innerHTML;
    break;
  case "2":
    textfield.value = document.getElementById("case2").innerHTML;
    break;
  }
}

このようにして、JavaScript コード内でユーザー入力を安全にエンコードすることを心配する必要はありません。JS コード内では決してありません。これは HTML 内にあり、安全のために HTML エンコードする方法はよく知られています。

明らかな欠点は、非表示の HTML 要素を生成することですが、許容できる妥協のようです...

于 2013-05-09T16:31:03.300 に答える