设置
我到底需要什么:一个组合框和一个文本字段。从组合框中选择一个项目会在文本字段中填充一个值。组合框中的项目来自用户输入。
这是我当前运行良好的代码:
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 代码注入,并且
- 填充到文本字段后它们看起来一样吗?