2011-08-04 11 views
1

私はウェブ上で次のJSを見つけました。このJavaScriptコードは安全ですか?

これは、url paramsの値を取得する関数です。私はexec()機能を見ると

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]; 
} 

は、しかし、常に私が思う:Eeek!

私の質問は:それは安全ですか?

サイドベットは:あなたは、この機能は吸うと思いますし、より良いオプションを持っている場合:)

を共有することを躊躇しないで上記の機能は、実際のURLを使用していますが、私は唯一のURLを含む文字列を解析する必要があります。

+3

'exec'呼び出しはコードを実行しません。なぜこれが安全でないのか分かりません。 – Amy

+0

は私にとっては安全だと思われますが、 '.exec'は単にそれを変更するのをやめてください。 – Ibu

答えて

2

Regexp#execは、とても良いインターフェイスではありませんが、安全です。

サイドベット:あなたは、この機能は吸うと思いますし、より良いオプションは、これは使用しません:)

yeeep

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

:-)共有することを躊躇しないで持っている場合a gロバール正規表現ですので、各ブラケットのインスタンスを1つだけ置き換えることになります。 field[][]は機能しません。また、文字グループは必要ありません... param.replace(/\[/g, '\\[')はうまくいきました。あるいは、正規表現でない置換イディオム、param.split('[').join('\\[')。その後

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

あなたは正規表現にそれらをドロップすると、彼らのリテラルの自己を意味し持つことができることはほぼ十分な文字をエスケープしていません。水密的な代替方法については、this questionを参照してください。

とにかくこの種の正規表現のハッキングは、URL /クエリ文字列を解析するのには適していません。これは、;または%のエンコーディング、または+のスペースでは適切に処理されず、URL内の他の場所でパラメータのルックアライメントを実行する可能性があります。

代わりに、最初にクエリ文字列を取得しましょう。リンクオブジェクトまたは位置オブジェクトがある場合は、.searchプロパティから取得できます。あなたが唯一の文字列のURLを持っている場合、あなたは確実にこれを取得するには、リンクオブジェクトにそれを回すことができます。

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

を今、あなたはその後、URLを落とし、&または;上の主要な?、分割をドロップすることによってにそれを解析することができますあなたが必要としない場合は

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 

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; 
} 

これは、パラメータを検索することが容易になります:JSオブジェクトに結果を復号されパラメータの複数の値を読み取る場合は、if...[]...pushダンスの代わりにlookup[name]= valueを実行して、リストの代わりにルックアップで単一の文字列値を返すことができます。

+0

うわー。ありがとう!私は特に 'var a = document.createElement( 'a');' smart :)を実行しています – PeeHaa

4

あなたの機能に表示される.exec()は、ウィンドウではなくRegExpオブジェクトのものです。

だから、使用するのが大丈夫です。

+3

はい、その正規表現(正規表現)メソッドの単なるメソッドです。あなたは "eval()"が表示される場合にのみ心配する必要があります –

+0

@Neal:k great!あまりにも妄想的すぎることはできません...実際にはそれは別の話です:P – PeeHaa

3

Regexp execevalを混同することはありません。少し不器用ですが、うまくいくはずです。

関連する問題