CakePHP用户锻造会话

时间:2012-01-11 19:08:36

标签: session cakephp

我在cakePHP应用程序中遇到了一种奇怪的行为。我有一些投票系统:

$user_id = ($this->Session->check('User')) ? $this->Session->read('User.id') : 0;
$data = array(
    'id' => NULL,
    'user_id' => $user_id,
    'object_id' => $this->params['form']['object_id'],
    'datetime' => date('Y-m-d H:i:s')
);

$this->Votes->create();
$this->Votes->save($data);

如您所见,如果未设置$_SESSION['User'],则user_id将为零(0)。否则,它将是用户ID。用户会话在用户登录时创建。

这允许非登录用户也投票,这没关系。

问题是...... 以某种方式保存了user_id != 0(即所谓存在和记录的成员)的一堆投票。当我检查用户ID时,它们在用户表中不存在。

就像有人用随机用户ID发送投票一样。 ID甚至不存在!

重要的是要注意:

  • 用户ID不是来自任何用户输入。它是从会话中读取的;
  • 投票与用户之间没有关系。这些表有两个不同的数据库,为此目的,它们不需要任何关系

有人知道我在这里遗失了什么吗?我是否认为事情不对?有人如何伪造用户ID,在这种情况下是一个不存在的ID?

2 个答案:

答案 0 :(得分:0)

(基于CakePHP 2.0.5,但它也应该适用于Cake 1.3.x)

首先,您如何设置用户的会话?你是什​​么意思User session is created when the user logs in

如果您正在挖掘User.id设置的AuthComponent,那么它实际上是Auth.UserAuth.User.id。您可以执行debug($this->Session->read())检查是否正确挖掘了Session的值。

通常,在我的应用程序中,我使用AuthComponent来获取登录的user.id.这是非常可靠的,因为如果你使用内置的AuthComponent::login方法,它会自动由Cake设置,并且一旦用户会话到期(或注销),Cake将取消设置它们,因此你可以依赖它来检查是否用户是否已登录。

我建议你:

$user_id = $this->Auth->user('id');
$data = array(
    'id' => NULL,
    'user_id' => $user_id,
    'object_id' => $this->params['form']['object_id'],
    'datetime' => date('Y-m-d H:i:s', time())
);

$this->Votes->create();
$this->Votes->save($data);

如果没有有效的用户会话,您的$user_id将是数字,或NULL

了解详情:

干杯

答案 1 :(得分:0)

问题解决了。这是注册过程中的错误。有一个步骤,新用户可以在决定之前返回更改/添加信息" OK"。

错误地,正在设置具有未来(但尚未创建)用户ID的会话。此时,如果该用户试图投票,他将拥有一个有效的会话但是不存在的用户。