转义要放置在生成的 JavaScript 源中的字符串,在 JavaScript 中
Escaping a string to be placed in generated JavaScript source, in JavaScript
我正在编写将生成一些 javascript 的代码。 javascript 将涉及将生成代码中的变量分配给传递给生成器的字符串。生成器也在javascript.
基本上我想这样做:
function generate_code(text) {
return "var a = " + jsEscapeString(text) + "; alert(a);";
}
function jsEscapeString(text) {
// WHAT GOES HERE?
// e.g. it needs to:
// - surround with quotes
// - escape quotes inside the text
// - escape backslashes and newlines and other fun characters
// - defend against other horrible things I probably don't know about
}
我不想要一些只有在令人满意的情况下才有效的东西。我想要一些 正确的。在恶意对手试图对结果代码进行沙箱逃逸时,可以幸存下来的东西(例如,就像你在 the game 'Untrusted' 中所做的那样)。
超级简单。
function jsEscapeString(text) {
return JSON.stringify(text);
}
无论你输入什么,你总是会得到一个有效的表示,可以转储到 JS 源代码中。执行时的结果将始终与您输入的完全相同。
这甚至适用于字符串、布尔值、数字、数组、对象...基本上您需要的一切。
虽然我很好奇你为什么要这样做...这闻起来有 eval
鱼腥味...
您需要转义反斜杠、字符串定界符和控制字符:
function jsEscapeString(text) {
return '"' +
text
.replace(/\/g, '\\')
.replace(/"/g, '\"')
.replace(/\r/g, '\r')
.replace(/\n/g, '\n')
.replace(/\t/g, '\t')
.replace(/\b/g, '\b')
.replace(/\v/g, '\v')
.replace(/\f/g, '\f')
+ '"';
}
我正在编写将生成一些 javascript 的代码。 javascript 将涉及将生成代码中的变量分配给传递给生成器的字符串。生成器也在javascript.
基本上我想这样做:
function generate_code(text) {
return "var a = " + jsEscapeString(text) + "; alert(a);";
}
function jsEscapeString(text) {
// WHAT GOES HERE?
// e.g. it needs to:
// - surround with quotes
// - escape quotes inside the text
// - escape backslashes and newlines and other fun characters
// - defend against other horrible things I probably don't know about
}
我不想要一些只有在令人满意的情况下才有效的东西。我想要一些 正确的。在恶意对手试图对结果代码进行沙箱逃逸时,可以幸存下来的东西(例如,就像你在 the game 'Untrusted' 中所做的那样)。
超级简单。
function jsEscapeString(text) {
return JSON.stringify(text);
}
无论你输入什么,你总是会得到一个有效的表示,可以转储到 JS 源代码中。执行时的结果将始终与您输入的完全相同。
这甚至适用于字符串、布尔值、数字、数组、对象...基本上您需要的一切。
虽然我很好奇你为什么要这样做...这闻起来有 eval
鱼腥味...
您需要转义反斜杠、字符串定界符和控制字符:
function jsEscapeString(text) {
return '"' +
text
.replace(/\/g, '\\')
.replace(/"/g, '\"')
.replace(/\r/g, '\r')
.replace(/\n/g, '\n')
.replace(/\t/g, '\t')
.replace(/\b/g, '\b')
.replace(/\v/g, '\v')
.replace(/\f/g, '\f')
+ '"';
}