2011-08-04 55 views
1

我在網上找到了下面的JS。此JavaScript代碼安全嗎?

這是一個獲取url參數值的函數。

function get_url_param(param) { 
    param = param.replace(/[\[]/,"\\\[").replace(/[\]]/,"\\\]"); 
    var regexS = "[\\?&]"+param+"=([^&#]*)"; 
    var regex = new RegExp(regexS); 
    var results = regex.exec(window.location.href); 
    if(results == null) 
    return ''; 
    else 
    return results[1]; 
} 

但總是當我看到一個exec()函數,我想:Eeek!

所以我的問題是:它是安全的嗎?

邊注:如果你覺得這個功能吮吸,有一個更好的選擇,不要猶豫,分享:)

以上功能使用真實的URL,但我只需要解析其中包含一個URL字符串。

+3

'exec'調用不執行代碼。我不明白爲什麼這是不安全的。 – Amy

+0

對我來說似乎是安全的,如果你不喜歡'.exec'只是改變它 – Ibu

回答

2

Regexp#exec是安全的,儘管不是一個非常漂亮的界面。

邊注:如果你覺得這個功能吮吸,有一個更好的選擇,不要猶豫,分享:)

yeeep :-)

param = param.replace(/[\[]/,"\\\[").replace(/[\]]/,"\\\]"); 

這不使用a g lobal正則表達式,因此您只替換每個括號的一個實例; field[][]不起作用。你也不需要字符組... param.replace(/\[/g, '\\[')會工作。或者,非正則表達式替換成語,param.split('[').join('\\[')

然後:

var regexS = "[\\?&]"+param+"=([^&#]*)"; 

你沒有逃跑近的字符足以能夠將它們拖放到一個正則表達式,並讓他們的意思是字面的自我。請參閱this question瞭解更多防水選擇。

無論如何,這種正則表達式仍然不是解析URL /查詢字符串的好方法。這與;% -encoding或+無法妥善處理,並且可能會在URL中其他地方的參數外觀上跳動。

取而代之,讓我們首先獲取查詢字符串。如果您有鏈接或位置對象,則可以從.search屬性中獲取該對象。如果你只有一個字符串的URL,你可以把它變成一個鏈接對象可靠地得到這樣的:

function getQueryString(url) { 
    var a= document.createElement('a'); 
    a.href= url; 
    return a.search; 
} 

現在,您可以通過刪除導致?,分裂就&;解析成,再滴加網址-decoded結果成JS對象:

function parseQuery(query) { 
    var lookup= {}; 
    var params= query.slice(1).split(/[&;]/); 
    for (var i= 0; i<params.length; i++) { 
     var ix= params[i].indexOf('='); 
     if (ix!==-1) { 
      var name= decodeURIComponent(params[i].slice(0, ix)); 
      var value= decodeURIComponent(params[i].slice(ix+1)); 
      if (!(name in lookup)) 
       lookup[name]= []; 
      lookup[name].push(value); 
     } 
    } 
    return lookup; 
} 

這使得它很容易查找參數:

var url= 'http://www.example.com/?a=b&c=d&c=%65;f[]=g#h=i'; 
var pars= parseQuery(getQueryString(url)); 

alert(pars.a);  // ['b'] 
alert(pars.c);  // ['d', 'e'] 
alert(pars['f[]']); // ['g'] 
alert('h' in pars); // false 

如果你不需要要讀取參數的多個值,您只需執行lookup[name]= value而不是if...[]...push舞蹈,即可在查找中返回單個字符串值而不是列表。

+0

哇。謝謝!我特別發現'var a = document.createElement('a');'聰明:) – PeeHaa

4

您在您的功能中看到的.exec()不是窗口,而是RegExp對象。

所以它使用完全沒問題。

+3

是的,它只是一個正則表達式(Regular Expression)方法。你應該只是擔心,如果你看到「eval()」 –

+0

@Neal:k太棒了!不能太偏執......其實你可以但那是另一個故事:P – PeeHaa

3

我不會混淆正則表達式execeval。有點笨重,但它應該工作。