2011-08-05 6 views
3

私は次の形式のコードを見ています - eval()safeを使用していますか?使用Javascriptのセキュリティに関する質問/ eval()の使用

function genericTakeAction(frm_name,id,pagenum,action) 
{ 
    var rset=eval("document."+frm_name); 

    var x=eval("document."+frm_name+".edit_key"); 
    var y=eval("document."+frm_name+".cAction") 
    if(x) 
     x.value=id; 
    if(y) 
     y.value=action; 

    page_list(pagenum); 
} 

その:それが正しいか間違っているかどうか

<a href="javaScript:;" onClick="genericTakeAction('frmSearch', 
    '<?php echo $rec_id;?>','<?php echo $pagenum?>','makeOpen')" 
    class='link6'>Make Open</a> 
+0

を参照してください。なぜGarethの答えを見てください。 –

答えて

5

、それは不必要に複雑です。

function genericTakeAction(frm_name,id,pagenum,action) 
{ 
    var rset = document[frm_name]; 

    var x = rset.edit_key; 
    var y = rset.cAction; 

    if(x) 
     x.value=id; 
    if(y) 
     y.value=action; 

    page_list(pagenum); 
} 

JavaScriptでは、次の2つのいずれかの方法で、オブジェクトのプロパティにアクセスすることができますので、これは動作します。例えば、点線の構文とリテラルの識別子を使用してどちらかまたはブラケットシンタックスと文字列識別子を使用します(例:x = obj.foo;)。 x = obj["foo"];。 (fooは最初のものでは引用符ではなく、2番目のものには引用符で囲まれていたが、両方とも正確にと同じものであることに注意してください。文字列になる式を使用してください。したがって、y = "f"; x = obj[y + "oo"];も動作します)。

PS間違っている

+0

しかし、 'document [frm_name]'が実際にオブジェクトか未定義でないかどうかを確認する必要があります。さもなければ、それらのプロパティにアクセスする際に型エラーが発生します。 – jAndy

+0

@jAndy:真ですが、 'eval'バージョンも同様です。 :-) –

+0

@TJCrowder:確かに、誰もが私の意見を得ると思う。バグを「回答」に残すのはなぜですか? – jAndy

1

eval()あなたがすでに認識しているように、安全でないと判断されているため、一般的に嫌われます。実際には、すべてのユーザーがFirebugのようなツールを使用して、彼らが望んでいた任意のコードをeval()可能性があるため、しかし、それは、問題の少ない

ブラウザ環境で

、など

問題がで、まだありますコードに埋め込まれたeval()は、ユーザーがeval()をトリガーしていることを知らずに実行できますが、PHPなどのサーバー側の環境よりもはるかに問題はありません。

eval()実際には、サーバーサイドリクエストから返されるJSONコードを実行するために表示されているように、通常は通常使用されます。最新のブラウザでは、専用のJSON parse()機能を使用してJSONをより安全にインポートできますが、古いブラウザではこの機能がなく、eval()を使用することを余儀なくされています。ほとんどのJSONライブラリのコードにはeval()というコードが含まれていますが、一般的にはeval()を実行する前に入力の消毒が行われます。

1

純粋なセキュリティの観点からは、もう少し複雑に見えるかもしれませんが、genericTakeAction()関数の 'frm_name'パラメータにはユーザーが指定したデータが含まれないようにする必要があります。

「frm_name」パラメータには、ハードコードされたリテラル「frmSearch」が含まれています。したがって、このgenericTakeAction()関数が、 'frm_name'パラメータのユーザ指定のデータで別の場所で呼び出されない限り、問題ありません。

これは `eval`の不要な用途のリストに、おそらく#1です。http://en.wikipedia.org/wiki/Cross-site_scripting#Traditional_versus_DOM-based_vulnerabilities