我从一个数据库中输出值(它并不真正对公众开放,但它对公司的用户开放——这意味着,我不担心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或任何其他库来实现这一点。
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, '\\');
}
您可以复制这两个函数(下面列出),并使用它们来转义/反转义所有引号和特殊字符。您不必使用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代码中的字符串?