2014-10-10 60 views
1

我開始開發一個簡單的PHP RESTful API。閱讀一些教程後,關於REST的特點之一是,安全PHP RESTful API

」 ......無國籍是關鍵。從本質上講,這是什麼意思的是,處理請求的 需要狀態包含請求 本身不論是作爲URI,查詢字符串參數,身體或頭 」

因此的一部分,這意味着我的PHP服務器將不再需要有$ _SESSION?你推薦什麼樣的方法?在URL中使用令牌(有效期限短)似乎不太安全? 例如www.myapi.com/1233asdd123/get_user/12。

非常感謝。

回答

2

如果您是任何類型的網絡開發人員,您會聽到這句話大概1000次:「HTTP是一種無狀態協議」。這意味着每個會話都與服務器和客戶端之間交換的令牌一起工作。

當您使用PHP內置的會話,服務器實際上做的正是這樣,即使你沒有意識到這一點:它會產生一個SESSION_ID並把它傳遞給客戶端。客戶端通常在cookie上傳回session_id令牌; PHP允許包括會話令牌還對URL,作爲一個GET參數,但我個人建議disabling that feature(默認情況下禁用PHP 5.3+)。

就你而言,是的,你將不會使用PHP的會話。
您在數據庫中創建一個存儲所有會話令牌和相關會話的表。

令牌應該有一個短的壽命(例如30分鐘),應該經常刷新。刷新不僅對於延長會話的使用壽命很重要(每刷新一次可以讓你多出30分鐘左右),而且還有助於防止會話密鑰被盜用。在我們創建的一些REST服務器中,會話令牌持續30分鐘,用戶在會話開始10分鐘後第一次請求時獲得新的令牌。當客戶發送新的令牌時,舊的令牌立即失效。

您可以在令牌傳遞到任何方式的服務器,而是將其添加爲GET參數是不是有兩個原因一個理想的解決方案:1。GET參數經常寫在服務器和2用戶的訪問日誌經常複製/粘貼URL並共享它們,並且可以公開其會話令牌。
對於API服務器,最好的方法是將會話令牌包含在HTTP請求的其中一個頭文件中。例如,您可以設置您的Authorization標頭:Authorization: SessionToken 123123123其中123123123是您的令牌,SessionToken是一個字符串,用於告訴服務器使用您的授權方法(您可以自由選擇自己的名稱,只要它不是默認的名稱像Basic這樣的方法;儘管一致!)。

API服務器的安全性通常通過使用SSL獲得。基本上,如果你有一個API服務器,你必須用HTTPS(SSL)保護它。
有些方法可以在不使用SSL的情況下實現安全性,但它們需要對每個請求進行簽名,並且實現和使用起來確實很複雜 - 而且它們添加的開銷可能比SSL更大。

+0

如果我構建一個移動應用程序,我可以輕鬆添加授權標題?感謝您的有用評論 – 2014-10-10 16:27:41

+0

@DiogoMendonça到目前爲止,我見過的每個庫都允許您輕鬆地在每個平臺上添加自定義標頭。這是一個非常標準的事情! PS:這個工具對開發很有幫助:http://www.getpostman.com – Qualcuno 2014-10-10 16:32:58

+0

對不起,只是一個問題:用Nonce發送令牌更好嗎? – 2014-10-20 10:17:19

1

一個非常普遍的做法是使用URL中的一個關鍵值:

www.myapi.com?key=ABCD1234

這不是比郵寄字符串較少/更安全。 SSL加密確保整個有效載荷不會被中間人攔截。

更多信息:

您也提到了臨時訪問(會話令牌)。在系統中使用憑據登錄(如上面的解決方案)是常見的,並在響應中獲得臨時會話令牌。然後使用會話令牌代替登錄詳細信息來查詢服務。它減少了在截取情況下對憑證的說明,並且如果有人設法竊取會話令牌,則它將僅工作幾分鐘。雖然沒有必要,但很好。