在JavaScript中转义要放置在生成的JavaScript源中的字符串

在JavaScript中转义要放置在生成的JavaScript源中的字符串,javascript,escaping,code-generation,Javascript,Escaping,Code Generation,我正在编写生成一些javascript的代码。javascript将涉及将生成代码中的变量分配给传递给生成器的字符串。生成器也是用javascript编写的 基本上我想这样做: function generate_code(text) { return "var a = " + jsEscapeString(text) + "; alert(a);"; } function jsEscapeString(text) { // WHAT GOES HERE? // e.g.

我正在编写生成一些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
}
我不想要只在快乐的情况下有效的东西。我想要一些正确的东西。恶意对手试图在生成的代码上执行沙盒转义时,能够生存下来的东西(例如,像您在中所做的一样)。

超级简单

function jsEscapeString(text) {
    return JSON.stringify(text);
}
无论您输入了什么,您都会得到它的有效表示形式,可以将其转储到JS源代码中。执行时,结果总是与您输入的内容完全一致

这甚至适用于字符串、布尔、数字、数组、对象。。。基本上你需要的一切


虽然我很好奇你为什么这么做。。。这闻起来像是鱼腥味……

您需要转义反斜杠、字符串分隔符和控制字符:

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')
    + '"';
}

(这个问题可能是重复的,但我的google fu让我失望了。)没有可以打断字符串的unicode字符,例如用于开始新行的替代字符?@Strilan:没有,其他新行字符没有任何用途,其他字符也没有特殊意义。例如,Unicode有可选的引号,但JavaScript不允许这些引号作为字符串分隔符。啊,当然。(这是一个小部件,用户可以在其中输入javascript作为解决难题的一部分。这不是安全敏感或影响数据的问题,我只是不想以一种一旦包含报价就会中断的方式编写它。)