簡體   English   中英

安全PHP RESTful API

[英]Security PHP RESTful API

我開始開發一個簡單的PHP RESTful API。 閱讀完一些教程之后,關於REST的一個特性就是

“......無狀態是關鍵。本質上,這意味着處理請求的必要狀態包含在請求本身中,無論是作為URI,查詢字符串參數,正文還是標題的一部分”

因此,這意味着我的PHP服務器不需要$ _SESSION? 你推薦什么樣的方法? 在URL中使用令牌(在短時間內有效)似乎有點不安全嗎? 例如www.myapi.com/1233asdd123/get_user/12。

非常感謝。

如果您是任何類型的Web開發人員,您可能會聽到這句話大概1000次:“HTTP是無狀態協議”。 這意味着每個會話都使用服務器和客戶端之間交換的令牌。

當您使用PHP的內置會話時,即使您沒有意識到,服務器實際上正是這樣做的:它生成一個session_id並將其傳遞給客戶端。 客戶端通常在cookie上傳遞session_id令牌; PHP允許在URL上包含會話令牌,作為GET參數,但我個人建議禁用該功能 (默認情況下在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更大。

一種非常常見的做法是在URL中使用鍵值:

www.myapi.com?key=ABCD1234

它比POST字符串更安全。 SSL加密可確保整個有效負載不會被中間人攔截。

更多信息 :

您還提到了臨時訪問(會話令牌)。 在系統中使用憑證(如上面的解決方案)登錄並在響應中獲取臨時會話令牌是很常見的。 然后使用會話令牌而不是登錄詳細信息來查詢服務。 在攔截的情況下,它減少了憑證的展示,如果有人設法竊取會話令牌,它將只工作幾分鍾。 盡管不是必需的但是很好。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM