CodeIgniter バージョン 2.1.4 とIon Authをかなり長い間使用してきましたが、すべてうまく機能していました。昨日、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
関数 ( にあるTemplate.php
ファイル内/libraries/
) は最初から (何ヶ月も前) 正常に動作しています。Ion Auth の新しいバージョンでも、テンプレートの読み込み機能は動作しています... しかし、上記のようにセキュリティ エラーが発生し続けます。
いくつかの調査を行った後、エラーの原因は Ion Auth の CSRF セキュリティ ルーチンです。これら 2 つの関数はコントローラ全体で呼び出され、関数が を返す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
}
}
一時的な (または恒久的な?) 回避策として、CodeIgniterconfig/config.php
ファイルの 298 行目で「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
次に、常に関数から戻ることで、Ion Auth の CSRF 保護を抑制しました。
function _valid_csrf_nonce()
{
return TRUE;
}
ただし、ここで根本的な原因を理解したいと思います。古いブラウザを使用したり、独自のテンプレート内に Ion Auth ビューを配置しようとしたりするだけで、これらすべての CSRF エラーが発生するのはなぜですか? すべてが同じドメインを使用する同じサーバー上にあります。
(編集: はい、CIsession
ライブラリは自動ロードされており、明らかに正常に動作しています。結局のところ、ログインしたままにすることができます。)