2015-09-20 94 views
0

我正在編寫將生成一些javascript的代碼。 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'中做的那樣)。

+1

(這個問題可能是重複的,但是我的google-fu讓我失望。) –

回答

2

超級簡單。

function jsEscapeString(text) { 
    return JSON.stringify(text); 
} 

不管你放什麼,你總是會得到它的有效表示,可以傾倒入JS源。結果,執行時,將始終正是你所投入的。

這甚至適用於字符串,布爾值,數字,數組,對象......基本上你會需要的一切。

雖然我很好奇,爲什麼你這樣做......這氣味腥臭eval ...的

+0

啊,當然。 (這是一個小部件,用戶可以輸入javascript作爲解決難題的一部分。它不是安全敏感的或影響重要的數據,我只是不想以一種包含) –

0

您需要逃離反斜槓,字符串分隔符和控制字符:

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

有沒有可以打破字符串的unicode字符,例如開始新行的替代字符? –

+0

@Strilanc:不,對其他新行字符沒有用處,其他字符沒有特殊含義。例如,Unicode有另外的引號,但JavaScript不允許那些字符串分隔符。 – Guffa

相關問題