我已經創建了一個完全正常工作的Web服務。但是,只要在config/main.php中啓用CSRF驗證,當嘗試使用Web服務時會出現以下錯誤消息:CSRF驗證與Android應用程序的Web服務
無法驗證CSRF令牌。
而不是跳過CSRF令牌驗證,有沒有其他解決方案呢?
當通過Android應用程序使用網絡服務時,是否有一種方法可以實際驗證CSRF令牌的成功?
我已經創建了一個完全正常工作的Web服務。但是,只要在config/main.php中啓用CSRF驗證,當嘗試使用Web服務時會出現以下錯誤消息:CSRF驗證與Android應用程序的Web服務
無法驗證CSRF令牌。
而不是跳過CSRF令牌驗證,有沒有其他解決方案呢?
當通過Android應用程序使用網絡服務時,是否有一種方法可以實際驗證CSRF令牌的成功?
這取決於問題中沒有提到的多種事情。
第一個問題是驗證如何在服務中起作用。如果它是客戶端瀏覽器不會自動發送的東西(即不是基於cookie的,而是例如添加到請求頭的令牌),那麼這些服務不會受到CSRF的攻擊,您可以關閉csrf保護。
如果它使用cookies(大多數情況下可能不是最好的服務),那麼您需要保護它免受CSRF攻擊。至於如何,這取決於實施什麼保護。如果它是標準的synchronizer token pattern,那麼您需要先通過GET下載頁面,然後提取該令牌並將其發送回相應的POST/PUT/DELETE請求中的相應字段。這在移動應用程序中看起來很尷尬,您最好將API更改爲基於令牌的身份驗證。 :)如果是類似於double posting的東西,則可以製作服務中接受的雙張標記。如果是別的,你需要了解保護是如何工作的,並找出如何將正確的東西傳遞給服務。
作爲旁註,它不僅基於cookie的身份驗證可能容易受到CSRF的影響。例如,如果API使用HTTP基本身份驗證,那麼它也會被瀏覽器緩存並自動發送,因此如果用戶直接向瀏覽器輸入憑據,就很容易受CSRF攻擊(但這是一個奇怪的用例,可以降低風險)。客戶端證書也由瀏覽器自動發送,同樣可能容易受到CSRF攻擊。
所以總結起來(以及一些簡化,詳見上文):
另外要注意,如果CORS是在服務(不需要移動應用),即複雜化啓用事情有點CSRF,但這是一個正交的問題。
感謝您的快速回復! 我的驗證服務不是基於cookie的,所以我刪除了CSRF保護。 但是現在,隨着每個新的請求,它都會發送一個新的會話ID,因爲我的購物車沒有顯示任何產品。當有人將產品添加到購物車中時,它帶有一些session_id(sess_4qc418amqa6g69uicosu0jsou6),但在購物車頁面上。它表示購物車頁面上的session_id(sess_5mcj87a15b39o1r8fm9tp8gkl6)被更改爲零產品。我使用yii1.1.17。 –
它看起來像服務器的會話處理有一些其他問題,當我從Web瀏覽器或郵遞員調用Web服務時,它按預期工作,但是當我使用來自Android應用程序的Web服務時,服務器將每個請求視爲一個新用戶,因此每次都創建新的會話。 不知道是什麼原因導致問題,相同的應用程序在另一臺服務器上正常工作。 –