2011-09-30 74 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()函數轉義key和value。

陣圖是我很難理解:

我試圖與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

爲什麼它不危險?您可以輕鬆更改表單上的$ _POST鍵,或使用類似Tamperdata的鍵。我在mysql查詢中使用的一些鍵。 – Ben

+0

我沒有說他們不能。我說你需要解釋爲什麼在你的應用程序中*一個鍵可能是危險的。這將告訴我們使用您的情況的最佳方法。 – webbiedave

回答

8

有人能向我解釋爲什麼你不能傳遞一個關鍵的參考?

因爲語言不支持這一點。你很難在大多數語言中找到這種能力,因此術語

所以我是堅持了這樣的事情?

是的。最好的方法是用適當的鍵創建一個新的數組。

任何的替代品?

提供更好選擇的唯一方法就是了解您的具體情況。如果您的鍵映射到表列名稱,那麼最好的方法是將鍵保留原樣並在您的SQL中使用時將其轉義。

0

爲什麼是這樣做有問題嗎?讓它成爲一個功能。函數接受輸入並給出輸出。你的函數輸入將是你的「不安全」數組。您的輸出將是保護陣列的結果。

然後你只需做

$where = secureMyArray($where); 

這就是爲什麼你必須做出職能的能力...