当前页面的登录链接作为查询字符串传递,然后使用它来发回用户

时间:2011-08-21 11:55:41

标签: cakephp

如何在CakePHP页面上创建一个包含当前页面查询字符串的登录链接,例如:domain.com/login/?back=/posts/This_is_a_post

然后如何在login方法中使用此功能将用户BACK发送到此网址?

我试过这个:<?php echo $this->Html->link('Log in', array('controller'=>'users','action'=>'login','admin'=>false, '?'=> array('back'=>$this->here)), array('escape'=>false)); ?>

但它在网址/login?back=%2Fportfolio%2Fgt%2FCreatHive

上执行此操作

如何让它不更改网址中的/

干杯

2 个答案:

答案 0 :(得分:0)

更新 - 请尝试使用命名参数:

您的链接:

echo $this->Html->link('My Link', array('controller' => 'users', 'action' => 'login', 'url' => $url));

在您的用户中登录:

function login(){
    if($this->Session->read('Auth.User')){
        $url = $this->params['named']['url']
        // encode/decode url
        $this->redirect("$url");
    }
}

您可以随时将urlencode()和urldecode()用于$ url变量。

您还需要确保您的表单还将URL发送回登录功能:

echo $this->Form->create('User', array('controller' => 'users', 'action' => 'login', 'url' => $url));

答案 1 :(得分:0)

执行此操作的最佳方法是在某个时间点存储会话中访问的最后一页,可能是在login操作中加载页面时。你为什么问?攻击者可以链接到您的网站,例如:yoursite.com/login?back=mysite.com/login,这样当用户登录时,您就会将其发送到我的网站,这与您的登录表单完全相同并获取他们再次登录。 Voila,攻击者现在可以轻松地窃取用户信息。

对于会话,也没有网址编码问题。在您的login操作中就是这样的:

$this->Session->set('back_to', $this->referer());

// Then if they have logged in:
$backTo = $this->Session->read('back_to');
if($backTo) {
    $this->redirect($back_to);
} else {
    $this->redirect($this->Auth->redirect());
}