我从一个数据库中输出值(它并不真正对公众开放,但它对公司的用户开放——这意味着,我不担心XSS)。
我试图输出一个这样的标签:
<a href="" onclick="DoEdit('DESCRIPTION');">Click Me</a>
DESCRIPTION实际上是一个来自数据库的值,它是这样的:
Prelim Assess "Mini" Report
我尝试用“\”替换“”,但无论我怎么尝试,Firefox总是在单词evaluate后的空格后面切断我的JavaScript调用,这导致了各种各样的问题。
我肯定错过了那个显而易见的答案,但我怎么也想不出来。
有人想指出我的愚蠢吗?
这里是整个HTML页面(它将是一个ASP。NET页面最终,但为了解决这个问题,我拿出了一切,但问题代码)
<html>
<body>
<a href="#" onclick="DoEdit('Preliminary Assessment \"Mini\"'); return false;">edit</a>
</body>
</html>
请在下面的代码中找到,它使用正则表达式转义单引号作为输入字符串的一部分。它验证用户输入的字符串是否以逗号分隔,同时它甚至转义作为字符串一部分输入的任何单引号。
为了转义单引号,只需输入一个反斜杠,后面跟着一个单引号,如:\ '作为字符串的一部分。我在这个例子中使用了jQuery验证器,您可以根据自己的方便使用。
有效字符串示例:
“你好”
“你好”、“世界”
‘你好’,‘世界’
‘你好’,‘世界’,‘’
“这是我的世界”,“没有我不能享受这一切”。,“欢迎,客人”
HTML:
<tr>
<td>
<label class="control-label">
String Field:
</label>
<div class="inner-addon right-addon">
<input type="text" id="stringField"
name="stringField"
class="form-control"
autocomplete="off"
data-rule-required="true"
data-msg-required="Cannot be blank."
data-rule-commaSeparatedText="true"
data-msg-commaSeparatedText="Invalid comma separated value(s).">
</div>
</td>
JavaScript:
/**
*
* @param {type} param1
* @param {type} param2
* @param {type} param3
*/
jQuery.validator.addMethod('commaSeparatedText', function(value, element) {
if (value.length === 0) {
return true;
}
var expression = new RegExp("^((')([^\'\\\\]*(?:\\\\.[^\'\\\\])*)[\\w\\s,\\.\\-_\\[\\]\\)\\(]+([^\'\\\\]*(?:\\\\.[^\'\\\\])*)('))(((,)|(,\\s))(')([^\'\\\\]*(?:\\\\.[^\'\\\\])*)[\\w\\s,\\.\\-_\\[\\]\\)\\(]+([^\'\\\\]*(?:\\\\.[^\'\\\\])*)('))*$");
return expression.test(value);
}, 'Invalid comma separated string values.');
您可以复制这两个函数(下面列出),并使用它们来转义/反转义所有引号和特殊字符。您不必使用jQuery或任何其他库来实现这一点。
function escape(s) {
return ('' + s)
.replace(/\\/g, '\\\\')
.replace(/\t/g, '\\t')
.replace(/\n/g, '\\n')
.replace(/\u00A0/g, '\\u00A0')
.replace(/&/g, '\\x26')
.replace(/'/g, '\\x27')
.replace(/"/g, '\\x22')
.replace(/</g, '\\x3C')
.replace(/>/g, '\\x3E');
}
function unescape(s) {
s = ('' + s)
.replace(/\\x3E/g, '>')
.replace(/\\x3C/g, '<')
.replace(/\\x22/g, '"')
.replace(/\\x27/g, "'")
.replace(/\\x26/g, '&')
.replace(/\\u00A0/g, '\u00A0')
.replace(/\\n/g, '\n')
.replace(/\\t/g, '\t');
return s.replace(/\\\\/g, '\\');
}
“;在这个特殊的情况下,就像我之前建议的,因为HTML上下文。
然而,如果你想让你的JavaScript代码在任何上下文中独立转义,你可以选择原生JavaScript编码:
'变成\x27
变成了\x22
所以你的onclick会变成:DoEdit('初步评估\x22Mini\x22');
例如,当将JavaScript字符串作为参数传递给另一个JavaScript方法时(alert()是一个简单的测试方法),这也可以工作。
我指的是重复的堆栈溢出问题,我如何转义一个onClick处理程序内的JavaScript代码中的字符串?