2014-08-28 128 views
0

我有一個字符串,我需要確保它僅包含一個正則表達式並沒有JavaScript的,因爲我創建與字符串的新腳本,這樣一段JavaScript代碼,將是一個安全風險。檢查字符串中包含正則表達式和無JS

確切的情況:

  1. JS在Mozilla插件加載配置JSON通過的HttpRequest(JSON包含{ 「東西」: 「^(?:HTTP | HTTPS)://(:*)?」。 }
  2. JS創建一個使用「東西」正則表達式從配置

任何想法如何逃避串而不破壞它的正則表達式PAC文件(代理配置腳本)?

+0

正則表達式不規則。我懷疑可以準確地將正則表達式與正則表達式匹配。 – 2014-08-28 15:35:07

+0

那麼,字符串是從文件讀取/轉換?這意味着你不能將正則表達式與其他任何東西分開。 – sln 2014-08-28 15:43:12

+0

如上所述,該字符串來自通過httprequest加載的json文件。但是由於Mozilla的安全問題(對我來說也是有意義的),我需要確保該字符串確實包含一個正則表達式,而不是其他東西。如果它包含JavaScript而不是正則表達式,則js將在pac文件中執行。 – 2014-08-28 15:50:35

回答

0

似乎大多數標準JavaScript功能都可以source),所以你可以這樣做:

try { 
    RegExp(json.something+''); 
    pacFile += 'RegExp(' + JSON.stringify(json.something+'') + ')'; 
} catch(e) {/*handle invalid regexp*/} 

而且不用擔心,因爲一個RegExp("console.log('test')")只會產生一個有效的/console.log('test')/正則表達式和執行沒有。

0

您可以使用正則表達式來拉開JavaScript正則表達式。

然後,您應該將正則表達式轉換爲JavaScript的詞彙更簡單的子集,以避免所有關於/意味着什麼的非上下文無關的怪異以及輸入正則表達式中的任何不規則性。

var REGEXP_PARTS = "(?:" 
    // A regular character 
    + "[^/\r\n\u2028\u2029\\[\\\\]" 
    // An escaped character, charset reference or backreference 
    + "|\\\\[^\r\n\u2028\u2029]" 
    // A character set 
    + "|\\[(?!\\])(?:[^\\]\\\\]|\\\\[^\r\n\u2028\u2029])+\\]" 
    + ")"; 

var REGEXP_REGEXP = new RegExp(
    // A regex starts with a slash 
    "^[/]" 
    // It cannot be lexically ambiguous with a line or block comemnt 
    + "(?![*/])" 
    // Capture the body in group 1 
    + "(" + REGEXP_PARTS + "+)" 
    // The body is terminated by a slash 
    + "[/]" 
    // Capture the flags in group 2 
    + "([gmi]{0,3})$"); 

var match = myString.match(REGEXP_REGEXP); 

if (match) { 
    var ctorExpression = 
     "(new RegExp(" 
     // JSON.stringify escapes special chars in the body, so will 
     // preserve token boundaries. 
     + JSON.stringify(match[1]) 
     + "," + JSON.stringify(match[2]) 
     + "))"; 
    alert(ctorExpression); 
} 

這將導致一個表達式在JavaScript的一個很好理解的子集中。

複雜的正則表達式以上不在TCB。唯一需要正確執行安全功能的部分是ctorExpression,包括使用JSON.stringify

相關問題