2011-03-20 177 views
7

我在CodeIgniter中有一個非常奇怪的CSRF保護問題。我已經確定我使用form_open來開始我的表單,在配置文件中將csrf_protection設置爲true,並且我還確保隱藏的csrf名稱和值字段與csrf cookie匹配,如下所示:http://d.pr/3cfBCodeIgniter的CSRF令牌問題

發生什麼事情是,當我提交表單時,我得到「遇到錯誤,您請求的操作不被允許。」錯誤,我不知道爲什麼。當我關閉csrf_protection時,表單工作正常。

什麼是更奇怪的是,我使用tank_auth庫進行身份驗證,它也使用form_open作爲登錄表單。當csrf_protection打開時,我確實檢查了登錄表單中是否存在隱藏的csrf字段,並且我能夠提交表單並登錄而沒有任何問題。

想到我能做些什麼來調試這個問題?

回答

1

我發現了這個問題。在我的一個自定義庫中,我有parent :: _ sanitize_globals(),這顯然是導致錯誤的原因。我在某處讀到,如果我打開了xss過濾器,我不需要對全局進行清理。

1

首先,會話類期望名爲'csrf_token_name'的記號,而不是名爲'csrf_salemarked_token $ ...'的記號。

此博客文章涵蓋了AJAX with CSRF Protection in Codeigniter 2.0

Tank_auth從隱藏的輸入表單字段獲取令牌,而不是cookie。您的AJAX請求需要從隱藏字段(如果可用)或cookie(如果沒有表單)獲取令牌。

+0

嗯,我不確定我是否同意你的看法。一些事情 - 首先,csrf_token_name是CI配置的一部分 - http://d.pr/lQHG,所以'csrf_salemarked_token $ ...'是令牌的名稱。第二,我不想做任何Ajax表單提交。第三,我以同樣的方式創建了我的表單,tank_auth創建了它的表單,我進行了雙重檢查,兩個表單都有一個帶有csrf標記名稱和值的隱藏輸入。 – 2011-03-20 16:00:05

+0

woof ...你是對的令牌名稱。不知何故,我升級時沒有遷移新的配置文件 – coolgeek 2011-03-20 17:23:40