0

ajax フォームでトークンを使用したい。フォームは、一意のトークンを生成する ajax コントローラーから読み込まれます。次に、フォームが同じコントローラーに投稿されます。

しかし、私はそれを正しく理解できません!フォームが読み込まれてから投稿されると、セッションが空になるか、新しいトークンが作成されます! これは、ajax 呼び出しが行われたときにフォームとトークンが作成されるためだと思います。

これが私がしたことです:

ajax コントローラーの before() に create the token 関数を配置しました。ajax がページをロードするたびに、常に変化しているため検証されない新しいトークンが作成されます。

そこで、トークン関数をメインコントローラーに移動し、そこにトークンを作成しました。ajaxコントローラーはメインコントローラーを拡張せず、別のものです。私は今、ajax呼び出しがトークン関数をロードしないと思ったからです。代わりに、ajax コントローラーはメインで作成されたトークンを取得するだけです。でも……空っぽ

私は試しました Session::instance()->get('securitytoken') アプリケーション全体のすべてのセッションにアクセスするはずですよね?

誰も私がこれを正しくする方法を知っていますか? または、別のコントローラーで作成されたセッションにアクセスできないのはなぜですか?

このテスト関数は ajax を介してトークンを取得します

class Controller_Ajax extends Controller_Temp{ 
public function action_test(){
$user2 =  Session::instance()->get('securitytoken');
echo $user2; }
}

私のメインコントローラーで:

$token = md5(uniqid(microtime(), true));    


Session::instance()->set('securitytoken', $token);

ありがとうございました

4

1 に答える 1

1

ビュー内:

<?php echo Form::hidden('csrf', Security::token()) ?>

コントローラー内で、検証ライブラリを介してこれを確認します。

<?php

$post = Validation::factory($_POST)
    ->rule('name', 'not_empty')
    ->rule('email', 'not_empty')
    ->rule('email', 'email')
    ->rule('csrf', 'not_empty')
    ->rule('csrf', 'Security::check')
;
if($post->check()) { ... }
?>
于 2012-09-18T11:11:27.937 に答える