0

我想在我的 ajax 表单中使用令牌。表单是从生成唯一令牌的 ajax 控制器加载的。然后表单发布到同一个控制器。

但我做错了!当表单被加载然后发布时,会话为空或创建了一个新令牌!我猜这是因为表单和令牌是在进行 ajax 调用时创建的。

这是我所做的:

我将创建令牌函数放在 ajax 控制器的 before() 中,每次 ajax 加载页面时,它都会创建一个永远不会验证的新令牌,因为它总是在变化。

所以然后我将令牌功能移动到主控制器并在那里创建令牌,ajax 控制器不扩展主控制器,它是独立的。因为我认为现在 ajax 调用不会加载令牌函数。相反,ajax 控制器将只获取在 main 处创建的令牌。但是......它是空的

我试过 Session::instance()->get('securitytoken') 它应该访问整个应用程序的所有会话,对吗?

有谁知道我怎样才能做到这一点?或者为什么我无法访问在另一个控制器中创建的会话?

这个测试函数通过ajax获取token

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 回答