【发布时间】:2013-04-29 06:22:51
【问题描述】:
设置
我到底需要什么:一个组合框和一个文本字段。从组合框中选择一个项目会在文本字段中填充一个值。组合框中的项目来自用户输入。
这是我当前运行良好的代码:
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 代码注入,并且
- 它们在填充到文本字段后看起来一样吗?
【问题讨论】:
-
如果您的服务器端代码需要在将成为 JS 字符串的内容中包含用户输入的数据,而不是
htmlEncode(),您可以进行字符串替换以将任何"字符更改为 @987654328 @。如果用户输入的数据可能包含回车或换行,您也应该替换它们。那么浏览器看到的将只是一个有效的 JS 字符串。 -
那么您如何描述这种转变?让用户输入成为有效的 JS 字符串?...
-
只发送 JSON 编码的纯文本和 JSON 编码的 html 实体会不会过大?这会将所有编码移至服务器,从而避免任何潜在的安全问题。本土的编码方案可以而且通常会失败。保持简单...
-
我不想使用任何非标准编码,这就是为什么我试图避免这里的大部分答案。
标签: javascript encoding combobox populate