2013-10-31 45 views
3

我一直在使用CodeIgniter 2.1.4版本和Ion Auth很長一段時間,一切都很好。昨天,我將Ion Auth更新爲最新版本,每當我嘗試「編輯」任何用戶配置文件時,現在都會收到CSRF錯誤。CodeIgniter 2,Ion Auth在配置文件編輯時提供CSRF錯誤消息

「此表單文章未通過我們的安全檢查。」

修改controllers/auth.php文件後,出現此錯誤,以便將各種Ion Auth視圖加載到我自己的模板中。畢竟,如果我不能將它集成到我的網站設計中,這有什麼好處。 但是,即使auth.php控制器根本沒有修改,我也會在舊版本的Safari中出現此錯誤。

這是我對auth.php控制器文件的簡單修改。

替換這一行:

$view_html = $this->load->view($view, $this->viewdata, $render); 

這一行:

$view_html = $this->template->load('default', $view, $this->viewdata, $render); 

是的,我load功能(在位於/libraries/Template.php文件)一直在努力從一開始就好了(很多幾個月前)。即使使用新版本的Ion Auth,我的模板加載功能也在工作......但是,我只是不斷收到上述的安全錯誤。


經過一番研究,導致錯誤的原因是Ion Auth的CSRF安全例程。這兩個函數在整個auth.php控制器中調用,並在_valid_csrf_nonce()函數返回false時顯示上述錯誤。

function _get_csrf_nonce() 
{ 
    $this->load->helper('string'); 
    $key = random_string('alnum', 8); 
    $value = random_string('alnum', 20); 
    $this->session->set_flashdata('csrfkey', $key); 
    $this->session->set_flashdata('csrfvalue', $value); 

    return array($key => $value); 
} 

function _valid_csrf_nonce() 
{ 
    if ($this->input->post($this->session->flashdata('csrfkey')) !== FALSE && 
     $this->input->post($this->session->flashdata('csrfkey')) == $this->session->flashdata('csrfvalue')) 
    { 
     return TRUE; // <-- no error 
    } 
    else 
    { 
     return FALSE; // <-- error 
    } 
} 

作爲臨時(或永久?)的解決辦法,我已經啓用上線298在笨config/config.php文件中的「CSRF保護」選項。

$config['csrf_protection'] = TRUE; // enabled CSRF protection 
$config['csrf_token_name'] = 'csrf_test_name'; 
$config['csrf_cookie_name'] = 'csrf_cookie_name'; 
$config['csrf_expire'] = 7200; 

然後,我通過始終從函數返回true抑制離子驗證的CSRF保護。

function _valid_csrf_nonce() 
{ 
    return TRUE; 
} 

不過,我真的想了解這裏的根本原因。爲什麼我只需使用舊版瀏覽器或嘗試將Ion Auth視圖放入我自己的模板中即可獲得所有這些CSRF錯誤?所有內容都在使用相同域的同一臺服務器上。

(編輯:是的,在CI session庫被自動加載,顯然做工精細,我可以保持登錄狀態,畢竟)

回答

9

我從來沒有得到根本原因,但是我有一個理論可能會解釋一些:

Ion Auth CSRF保護取決於flashdata,其中flashdata只存活到服務器的「下一個」呼叫。我的自定義模板加載器可能會先調用服務器兩次,因爲它首先調用構建頁面的加載函數,然後調用CodeIgniter的視圖函數。

但是,這個理論並沒有真正解釋爲什麼未經修改的Ion Auth版本在Safari中仍然失敗。如果您可以添加任何重要或最終結論,請隨時發佈其他答案。


按照從本茲,離子驗證的開發者個人的迴應......

「我們增加CSRF保護到離子驗證實例之前CI內置到他們,所以你的框架可能最好將它們從Ion Auth示例控制器中刪除,並查看您是否使用內置的新版CI。「

因爲我已經在使用最新版本的CodeIgniter(2.1.4),所以我決定走這條路。

從我的OP的臨時解決方法現在是永久性的:

我已經啓用上線298在配置笨/ config.php文件中的「CSRF保護」選項。

$config['csrf_protection'] = TRUE; // enabled CSRF protection 

然後,我通過始終從這個函數返回true抑制離子驗證的CSRF保護。

function _valid_csrf_nonce() 
{ 
    return TRUE; // effectively disables Ion Auth's CSRF protection 
} 

最後,開發商評論使用CodeIgniter的CSRF保護,而不是:「是嘛,真是一個更好的解決方案呢,因爲它是整個應用程序集成」