我正在从数据库中输出值(它实际上并不向公众开放,但它对公司的用户开放——也就是说,我不担心 XSS)。
我正在尝试输出这样的标签:
<a href="" onclick="DoEdit('DESCRIPTION');">Click Me</a>
描述实际上是数据库中的一个值,如下所示:
Prelim Assess "Mini" Report
我尝试将“替换为\”,但无论我尝试什么,Firefox 都会在单词 Assess 之后的空格后切断我的 JavaScript 调用,这会导致各种问题。
我必须错过明显的答案,但对于我的生活,我无法弄清楚。
有人愿意指出我的白痴吗?
这是整个 HTML 页面(最终将是一个 ASP.NET 页面,但为了解决这个问题,我取出了除问题代码之外的所有内容)
<html>
<body>
<a href="#" onclick="DoEdit('Preliminary Assessment \"Mini\"'); return false;">edit</a>
</body>
</html>
onclick
事件附件不显眼,并将您的所有数据库信息移动到一个数据岛中。事情会更干净,当您的字符串转义错误时,您实际上会遇到某种语法错误。
您需要转义要写入 DoEdit
的字符串以清除双引号字符。它们导致 onclick
HTML 属性过早关闭。
在 HTML 上下文中使用 JavaScript 转义字符 \
是不够的。您需要将双引号替换为正确的 XML 实体表示,"
。
由于 HTML 上下文,"
在这种特殊情况下会起作用,正如我之前所建议的那样。
但是,如果您希望 JavaScript 代码在任何上下文中独立转义,您可以选择原生 JavaScript 编码:
'
变为 \x27
"
变为 \x22
因此,您的 onclick 将变为:DoEdit('Preliminary Assessment \x22Mini\x22');
例如,当将 JavaScript 字符串作为参数传递给另一个 JavaScript 方法(alert()
是一个简单的测试方法)时,这也可以工作。
我指的是重复的 Stack Overflow 问题,How do I escape a string inside JavaScript code inside an onClick handler?。
"
当然可以。
"
,即 <input value="\x22quoted string\x22">
不起作用。
onclick="..."
)。 value
属性的值不在 JavaScript 上下文中处理,仅在 HTML 上下文中处理。
'mystring'.replace(/"/g, '\\x22').replace(/'/g, '\\x27')
<html>
<body>
<a href="#" onclick="DoEdit('Preliminary Assessment "Mini"'); return false;">edit</a>
</body>
</html>
应该做的伎俩。
伙计们,JavaScript 中已经有 unescape
函数对 \"
进行转义:
<script type="text/javascript">
var str="this is \"good\"";
document.write(unescape(str))
</script>
问题是 HTML 无法识别转义字符。您可以通过对 HTML 属性使用单引号和对 onclick 使用双引号来解决此问题。
<a href="#" onclick='DoEdit("Preliminary Assessment \"Mini\""); return false;'>edit</a>
我就是这样做的,基本上是str.replace(/[\""]/g, '\\"')
。
var display = document.getElementById('output'); var str = 'class="whatever-foo__input" id="node-key"'; display.innerHTML = str.replace(/[\""]/g, '\\"'); //将返回 class=\"whatever-foo__input\" id=\"node-key\"
如果您在 Java 中组装 HTML,您可以使用 Apache commons-lang 这个不错的实用程序类来正确地进行所有转义:
org.apache.commons.lang.StringEscapeUtils 为 Java、Java Script、HTML、XML 和 SQL 转义和取消转义字符串。
请在下面的代码中找到,它使用正则表达式将单引号作为输入字符串的一部分进行转义。它验证用户输入的字符串是否以逗号分隔,同时它甚至会转义作为字符串一部分输入的任何单引号。
为了转义单引号,只需输入一个反斜杠,后跟一个单引号,例如:\' 作为字符串的一部分。我在这个例子中使用了 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 做了一个示例
var descr = 'test"inside"outside';
$(function(){
$("#div1").append('<a href="#" onclick="DoEdit(descr);">Click Me</a>');
});
function DoEdit(desc)
{
alert ( desc );
}
这适用于 Internet Explorer 和 Firefox。
您可以复制这两个函数(如下所列),并使用它们来转义/取消转义所有引号和特殊字符。您不必为此使用 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, '\\');
}
也可以转义空格。在我看来,Firefox 假设了三个参数而不是一个。
是不间断的空格字符。即使这不是全部问题,它可能仍然是一个好主意。
您需要使用双反斜杠转义引号。
这失败了(由 PHP 的 json_encode 产生):
<script>
var jsonString = '[{"key":"my \"value\" "}]';
var parsedJson = JSON.parse(jsonString);
</script>
这有效:
<script>
var jsonString = '[{"key":"my \\"value\\" "}]';
var parsedJson = JSON.parse(jsonString);
</script>
您可以使用 escape() 和 unescape() jQuery 方法。如下图,
使用 escape(str);
转义字符串并使用 unescape(str_esc);
再次恢复。
'mystring'.replace(/"/g, '"');