2011-09-30 12 views
7

キーを参照として渡すことができない理由を説明できますか?キーと値の両方を渡すための代替方法参照先:

例:

if(is_array($where)){ 
    foreach($where as &$key => &$value){ 
     $key = sec($key); 
     $value = sec($value); 
    } 
    unset($key, $value); 
} 

例外:

Fatal error: Key element cannot be a reference in linkstest.php on line 2 

は私がarray_mapを使用して、同様の何かを行うことができますか? 私がやりたいことは、連想配列を反復し、sec()関数でキーと値の両方をエスケープすることです。私が理解するために

アレイマップは困難である:

私はarray_mapを持つ多くのことを試してみましたが、私はそれが直接のキーに基づいて行動することができません。

foreachループを使用するだけでなく、配列マップを使用してパフォーマンスを向上させることはできますか?私はforeachのについては好きではない何

は、私が直接配列に作用し、一時的な配列を作成し、それらを設定解除に対処する必要がないということです。

foreach($where as $key => $value){ 
$where[secure($key)] = secure($value); 
} 

それが何かを見つけた場合、これが失敗する可能性がありますキーでエスケープし、新しい要素を追加し、エスケープされていない要素を保持します。

私はこのようなことにこだわりましたか?

$temparr = array(); 
foreach($where as $key => $value){ 
$temparr[secure($key)] = secure($value); 
} 
$where = $temparr; 
unset($temparr); 

代替手段はありますか?

+0

これは大きな古い*理由*に値するでしょうか? 'sec($ key)'が別の既存のキーの値になったらどうなるでしょうか?既存のキーを上書きするだけですか?アプリケーションでキーが危険な理由を説明する必要があります。 – webbiedave

+0

なぜ危険なことはできませんでしたか?フォーム上やTamperdataのようなもので$ _POSTキーを簡単に変更することができます。 mysqlクエリで使用するいくつかのキー。 – Ben

+0

私は彼らができないと言っていませんでした。あなたのアプリケーション*で鍵が危険な理由を説明する必要があると言いました。それはあなたの状況に最適なアプローチを教えてくれるでしょう。 – webbiedave

答えて

8

は、誰かが私にはあなたが関数を作る能力を持っている理由です

$where = secureMyArray($where); 

説明できますか?

言語がこれをサポートしていないためです。ほとんどの言語でこの機能を見つけるのは難しいでしょうから、というキーという言葉があります。

私はこのようなことに取り組んでいますか?

はい。最適な方法は、適切なキーを使用して新しい配列を作成することです。

代替手段はありますか?

より良い選択肢を提供する唯一の方法は、特定の状況を知ることです。キーがテーブルのカラム名にマップされている場合、最善の方法はキーをそのままの状態にしておき、使用時にSQLでエスケープすることです。

0

なぜそれは問題ですか?それを関数にする。関数は入力を取り、出力を与えます。あなたの関数入力はあなたの "安全ではない"配列になります。あなたの出力は配列を確保した結果になります。あなたが基準に鍵を渡すことができない理由

次に、あなただけ...