我在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?
答案 0 :(得分:0)
(基于CakePHP 2.0.5,但它也应该适用于Cake 1.3.x)
首先,您如何设置用户的会话?你是什么意思User session is created when the user logs in
?
如果您正在挖掘User.id
设置的AuthComponent
,那么它实际上是Auth.User
和Auth.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的会话。此时,如果该用户试图投票,他将拥有一个有效的会话但是不存在的用户。