2011-01-29 119 views
2

我通過$ _GET []將urlencode()d serialize()d數組傳遞給我的網頁。

從$ _GET反序列化()值是否安全?反序列化的數組有時會顯示給用戶。用戶是否可以在我的代碼中暴露/引用變量或函數等?換句話說,在反序列化這個值時,PHP會把它當作數據還是代碼?

更新:

我看文檔說: 「數組/內部循環引用對象,你的序列化也將被存儲的任何其他參考將會丟失」

因此,這意味着我」安全嗎? :-)

+0

以前曾以某種形式問過這個問題,但我找不到這個笨蛋。 – 2011-01-29 20:03:47

回答

6

絕對,積極,沒有。

你不應該盲目地信任客戶端的任何東西,但是有一種方法可以讓你更自信。

我假設,如果你有從客戶端來的PHP序列化數據,該客戶端從某個服務器獲得某個點?如果是這種情況,並且客戶端不修改數據,那麼您可以在數據中包含散列值以驗證它沒有被篡改。

另一種方法是反序列化對象,但將其視爲「受污染」,然後將未反序列化的數據複製並重新驗證爲「乾淨」對象。

+1

反序列化對象*在某些相對深奧的情況下可能已經是一個安全問題 - 如果可以避免,我不會這樣做。看到我的答案 - 關於這個地方有一個完整的問題,但我找不到它... – 2011-01-29 20:12:22

+0

所有的答案都是內容豐富的,但這有一個實際的建議。但是,由於我的數組內容是簡單的明文,我只是將它作爲一個串聯的字符串傳遞並稍後將其分開。 – sil 2011-01-29 20:21:32

6

此方法與任何其他類型的傳入GET或POST數據一樣「安全」 - 您將在使用它之前需要對數據進行清理處理!但是,反序列化用戶數據還有其他問題。

當反序列化一個對象時,PHP會查看該類是否有__wakeup magic method。如果存在,該方法將被執行。

現在這本身並不是一個巨大的安全漏洞,因爲類定義從不在串行數據中傳輸。任何惡意代碼都必須已經存在於系統中。但是,有可能出現這種情況(例如可以安裝第三方代碼的插件系統),我會對此非常謹慎。

另外,理論上,這允許攻擊者在您的腳本中創建任何類的對象。儘管不是一個安全問題,但這絕對不是一個好習慣。

JSON編碼將是一種更安全的方式,因爲它只能包含「啞」數據。

+0

我喜歡這個回答。它還分離了數據和處理數據的PHP對象的概念。 *通常*,我發現這種分離使我更關鍵地考慮這個問題。 – 2011-01-29 20:45:27

0

您是序列化對象/數組/變量的純數據部分,實際的可執行代碼不serialized-存在這樣做沒有意義 - 系列化有助於兩個不同worlds-執行的代碼之間傳輸數據可以在那裏相同或不同 - 對於數據無關緊要。

雖然可能的黑客行爲是可能的 - 但僅基於數據 - 類和類型和值可能不同 - 它是代碼的起始碼,它在解序列化過程中如何應對錯誤。

-1

是的,它的安全。你問是否安全地序列化$ _GET數組的值。是的,這是安全的。在序列化數組期間沒有任何操作被執行。由於$ _GET數組不包含任何對象,只有來自查詢字符串的參數,所以在序列化/非序列化過程中不會造成任何傷害。

您提到了有關循環引用的文檔中所看到的內容。不要擔心,它不適用於你的情況,因爲$ _GET數組內沒有對象。

至於使用從$ _GET數組的實際數據,這是一個不同的問題和答案是否定的,它不是安全使用從$ _GET數組數據,而不應用一些類型的過濾器或驗證的第一