4

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ライブラリは自動ロードされており、明らかに正常に動作しています。結局のところ、ログインしたままにすることができます。)

4

1 に答える 1

10

私は根本的な原因に到達したことはありませんが、これのいくつかを説明する可能性のある理論があります:

Ion Auth CSRF 保護は、サーバーへの「次の」呼び出しのみが存続するflashdataに依存します。flashdataカスタム テンプレート ローダーは、最初にページが構築されるローダー関数を呼び出し、次に CodeIgniter のビュー関数を呼び出すため、サーバーを 2 回呼び出している可能性があります。

ただし、この理論では、修正されていないバージョンの Ion Auth が依然として Safari で失敗する理由を説明することはできません。これに実質的または決定的な何かを追加できる場合は、別の回答を自由に投稿してください。


Ion Auth の開発者である Ben Edmunds からの個人的な回答によると...

「CI がフレームワークに組み込まれる前に、Ion Auth の例に CSRF 保護を追加したので、それが組み込まれた新しいバージョンの CI を使用している場合は、Ion Auth の例のコントローラーとビューからそれらを削除するのが最善かもしれません。」

私はすでに CodeIgniter の最新バージョン (2.1.4) を使用しているので、このルートに進むことにしました。

私のOPからの一時的な回避策は現在永続的です:

CodeIgniter config/config.php ファイルの 298 行目で「CSRF 保護」オプションを有効にしました。

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

true次に、この関数から常に戻ることで、Ion Auth の CSRF 保護を抑制しました。

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

そして最後に、代わりに CodeIgniter の CSRF 保護を使用することについてコメントしている開発者:

「クールです。アプリケーション全体に統合されているため、とにかくこれは本当に優れたソリューションです。」

于 2013-11-01T18:44:23.170 に答える