2010-09-17 56 views
8

我將PHPSESSID傳遞到PHP頁面(通過POST),我想知道什麼是消毒輸入的最佳方式。 mysql_real_escape_string足夠嗎?在處理會話ID(我的意思是,它們只能是字母和數字)時,我應該考慮什麼?消毒PHPSESSID

編輯: 爲了澄清這個問題,我真正想知道的是:如果有人用POST數據篡改,可他發送惡意字符串作爲PHPSESSID當我打電話session_id($_GET['PHPSESSID']),會做一些討厭? 我個人想不出任何,但有備無患......

感謝

尼科

+0

你爲什麼要消毒呢?它(在大多數情況下)是自動生成的。 – fabrik 2010-09-17 13:42:40

+1

+ +1爲了良好的安全意識思維 – 2010-09-17 13:45:39

+0

@abrik:當然這是自動生成的,我只是擔心有人可能會欺騙POST數據,並對它做一些令人討厭的事情。不知道他們可以做什麼,但這就是爲什麼我問這個問題! – nico 2010-09-17 13:57:57

回答

7

善於思考,但據我所看到的,也沒有必要來淨化此輸入。 PHPSESSID將轉交給session_id()

SESSION_ID確實有some limitations:

根據會話處理器,並不是所有字符都會話ID內進行。例如,文件會話處理程序只允許範圍爲a-z A-Z 0-9,(逗號)和 - (減號)的字符!

但是session_id()應該處理偏離這些規則的錯誤消息。 (您可能想要捕獲該錯誤消息並在出錯時終止該腳本。)

我能看到的唯一真正的危險是當您使用自定義會話處理程序時,例如,連接到數據庫。在這種情況下,例如必須消毒輸入,例如,使用mysql_real_escape_string()。但是,這應該發生裏面自定義會話處理程序。

毫無疑問,如果您在其他上下文中使用會話ID - 例如,作爲HTML表單中的參數 - 您需要採取特定輸出所需的衛生措施(在這種情況下,htmlspecialchars())。

+4

謝謝佩卡,這就是我的想法,但我認爲最好問一個愚蠢的問題,而不是做一個愚蠢的錯誤! :) – nico 2010-09-17 13:56:48

2

如果你真的需要通過POST傳遞會話ID(不知道爲什麼真的......),並且你知道你想允許什麼字符,我會使用正則表達式來檢查它。

mysql_real_escape_string是用於數據庫輸入,並需要數據庫連接,不消毒任何東西,只是逃避一些特殊字符。

+0

謝謝你的答案。我使用的是一個依賴於Flash的腳本,我需要傳遞PHPSESSID,因爲Flash不會自動爲我執行它......這只是一個頁面,我不確定PHPSESSID的危險是什麼(如果有的話) )。無論如何,腳本連接到一個數據庫,所以'mysql_real_escape_string'想到了,但我不確定是否需要它。 – nico 2010-09-17 13:55:56

1

mysql_real_escape_string是否足夠?

錯誤。您應該始終使用適當的方法將數據清理到您要寫入值的地方。當你正在向MySQL數據庫寫入值時,你只能使用mysql_real_escape_string()。

從你的評論中不清楚你到底在做什麼。你的意思是你在PHP中使用curl來創建POST嗎?如果是這樣,那麼如果將CURLOPT_POSTFIELDS作爲數組傳遞,則不需要進行消毒處理(並非嚴格對待 - 但curl會爲您執行此操作),但是如果將CURLOPT_POSTFIELDS作爲字符串傳遞,則需要對該值進行urlencode。

您是否將值寫入瀏覽器,以便用戶可以提交該值?在這種情況下,您可以使用htmlentities()將值寫入表單字段。

還有其他的東西嗎?

+0

關於'htmlentities',你說得很好,謝謝。正如我對jeroen所說的,頁面是由Flash調用的,並且會話不會被傳遞,所以我只是發佈PHPSESSID,以便在Flash調用的PHP文件中重新創建會話。 (我正在使用JQuery Uploadify http://www.uploadify.com/並傳遞會話ID與scriptData參數,因爲他們建議這樣做)。 – nico 2010-09-17 16:07:04