2011-09-12 38 views
3

是PHP的json_decode()安全而不是eval()? eval()函數可以運行代碼,但是json_decode()也可以這樣做嗎?json_decode安全

回答

6

由於JSON只能表示數據,所以json_decode不會執行php代碼。

但是,就像任何其他函數一樣,json_decode的實現可能會出錯,並且允許執行任意(二進制,不(僅)php)代碼,例如buffer overflow。由於相對簡單和廣泛使用的代碼,這是不太可能的,並且在php程序中沒有任何東西可以或者應該做以減輕這種情況。

+1

錯誤+1。 PHP沒有很好的安全歷史,特別是許多字符串處理程序允許任意內存訪問。查看可開發PHP函數中的信息http://stackoverflow.com/questions/3115559/exploitable-php-functions/3451100#answer-3697776。當然,在PHP版本低於5.2.9的情況下,惡意攻擊者可能會使用json_decode()導致拒絕服務。請參閱CVE 2009-1271 http://osvdb.org/52486 我總是會嘗試在完全不受信任的數據上執行至少一種敷衍的驗證形式。 – Cheekysoft

+0

這不是一個有用的答案。問題是,'json_decode'是否可能是bug,並允許任意代碼執行。你沒有回答這個問題。 –

+0

D.W.由於OP明確提到'eval'是一個反面例子(它不是*旨在允許任意代碼執行,只是任意* php *代碼執行),所以我不認爲他在php實現中考慮了錯誤。另外,除非我完全誤讀了你的評論,這個答案的第二段恰恰回答了「是否json_decode'可能是錯誤的並且允許任意代碼執行」,「是的,就像任何其他函數一樣」。我很困惑什麼可以改進來澄清這個答案。你能給一個提示嗎? – phihag

1

eval()json_decode()是兩個不同的功能,我不知道你爲什麼認爲它們是相似的。一個評估字符串爲PHP代碼,另一個解碼JSON字符串。運行json_decode時沒有執行任何操作。

+1

也許OP將eval()與PHP中的eval()混淆在Javascript中。在JavaScript中,除了能夠評估和執行字符串作爲代碼之外,eval()還可以執行json_decode()在PHP中執行的操作(將JSON轉換爲對象)。 –