我正在从数据库中输出值(它不是真正对公共条目开放,但它可以由公司用户输入 - 这意味着,我并不担心XSS。 )
我正在尝试输出这样的标签:
<a href="" onclick="DoEdit('DESCRIPTION');">Click Me</a>
DESCRIPTION实际上是数据库中的值,如下所示:
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>
答案 0 :(得分:193)
您需要将正在写入的字符串转义为DoEdit
以清除双引号字符。它们导致onclick
HTML属性过早关闭。
在HTML上下文中使用JavaScript转义字符\
是不够的。您需要使用正确的XML实体表示"
替换双引号。
答案 1 :(得分:88)
"
可以在这个特殊情况下工作,正如我之前所建议的那样。
但是,如果您希望针对任何上下文单独转义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? 。
答案 2 :(得分:33)
<html>
<body>
<a href="#" onclick="DoEdit('Preliminary Assessment "Mini"'); return false;">edit</a>
</body>
</html>
应该做的伎俩。
答案 3 :(得分:23)
伙计们,JavaScript中已有unescape
函数可以对\"
执行无效操作:
<script type="text/javascript">
var str="this is \"good\"";
document.write(unescape(str))
</script>
答案 4 :(得分:12)
问题是HTML无法识别转义字符。你可以通过使用HTML属性的单引号和onclick的双引号来解决这个问题。
<a href="#" onclick='DoEdit("Preliminary Assessment \"Mini\""); return false;'>edit</a>
答案 5 :(得分:6)
我就是这样做的,基本上是str.replace(/[\""]/g, '\\"')
。
var display = document.getElementById('output');
var str = 'class="whatever-foo__input" id="node-key"';
display.innerHTML = str.replace(/[\""]/g, '\\"');
//will return class=\"whatever-foo__input\" id=\"node-key\"
<span id="output"></span>
答案 6 :(得分:2)
如果您使用Java汇编HTML,可以使用Apache commons-lang中的这个优秀实用程序类来正确执行所有转义:
org.apache.commons.lang.StringEscapeUtils
Escapes和unescapes 用于Java,Java脚本,HTML,XML和SQL的字符串。
答案 7 :(得分:1)
我使用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。
答案 8 :(得分:1)
请在下面的代码中找到使用正则表达式将单引号转义为输入字符串的一部分。它验证用户输入的字符串是否以逗号分隔,同时它甚至可以转义作为字符串一部分输入的任何单引号。为了逃避单引号,只需输入反斜杠,然后输入单引号,如: \'作为字符串的一部分。我在这个例子中使用了JQuery验证器,你可以根据你的运输工具使用它。
有效字符串示例:
&#39;你好&#39;
&#39; Hello&#39;,&#39; World&#39;
&#39;你好&#39;&#39;世界&#39;
&#39;你好&#39;&#39;世界&#39;,&#39; &#39;
&#39;这是我的世界&#39;如果没有我,就不能享受这一点。&#39;,&#39;欢迎,来宾&#39 ;
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 seperated string values.');
答案 9 :(得分:0)
也可以逃避空白。听起来像Firefox假设三个参数而不是一个。
是不间断的空格字符。即使不是整个问题,它仍然是一个好主意。
答案 10 :(得分:0)
你需要使用双反斜杠来转义引号。
这失败了(由PHP&#39; s 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>
答案 11 :(得分:0)
您可以使用escape()和unescape()jQuery方法。如下所示,
用户转义(str);转义字符串并使用unescape(str_esc)重新恢复;
答案 12 :(得分:0)
您可以复制这两个函数(列在波纹管下面),并使用它们对所有引号和特殊字符进行转义/转义。您不必为此使用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, '\\');
}