转义要放置在生成的 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')
    + '"';
}