我一直在使用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
庫被自動加載,顯然做工精細,我可以保持登錄狀態,畢竟)