使用html辅助链接方法的cakephp安全链接

时间:2009-09-16 05:36:20

标签: php cakephp

在cakephp中扩展html->链接功能的最佳方式是什么,以便我可以 告诉它输出安全(https)链接? 现在,我已经将自己的secure_link函数添加到app_helpers,基本上是一个 链接功能的副本,但在开头添加https。 但似乎应该有一种更好的方法来覆盖html-> link方法,以便我可以指定一个安全选项。

http://groups.google.com/group/cake-php/browse_thread/thread/e801b31cd3db809a 我也在google网上开了一个帖子,有人建议 做像

这样的事情
$html->link('my account', array('base' => 'https://', 'controller' => 'users')); 

但我无法做到这一点。

添加,这是我拥有上述代码时输出的内容。

<a href="/users/index/base:https:/">my account</a>

我认为850行上的cake / libs / router.php中存在一个错误。有一个关键字'裸',我认为它应该是'基础'虽然将其更改为基础但似乎无法修复它。 从我收集的内容来看,它告诉它要排除那些传入的键,这样它们就不会作为参数包含在内。但我很困惑为什么它是一个'裸'关键字,我能想出的唯一原因是它是一种类型。

4 个答案:

答案 0 :(得分:2)

简单地链接到页面的安全版本并不能完全阻止对非安全版本的访问,因此更好的方法可能是为所需的操作实现自动https切换。

<?php
class UsersController extends AppController {

    var $components = array('Security');

    function beforeFilter() {
        $this->Security->blackHoleCallback = '_forceSecure';
        $this->Security->requireSecure();
        /**
         * It is very common to require invocation 
         * of the parent beforeFilter().
         * Your usage may have the invocation 
         * at the top instead of at the bottom.
         */
        parent::beforeFilter();
    }

    function _forceSecure() {
        $this->redirect( 'https://'.env('SERVER_NAME').env('REQUEST_URI') );
    }
}
?>

使用此技术,您可以选择需要保护哪些控制器/操作,而无需担心将https://添加到每个链接。

答案 1 :(得分:1)

如果要覆盖基础,则还必须指定服务器名称,而不仅仅是协议。

如果您要创建的链接应为https://example.com/mysite/users/action,那么https://example.com/mysite/就是您的基础。

尝试运行此代码:

$html->link('my account', 
    array('base' => 'https://example.com/mysite/', 'controller' => 'users'));

答案 2 :(得分:1)

在_forceSecure()中,最好使用此行重定向:

$this->redirect('https://'.env('SERVER_NAME').env('REQUEST_URI'));

否则您将丢失GET请求中指定的任何参数。

答案 3 :(得分:1)

我能做到的最好的是:

$html->link('my account', str_replace('http://', 'https://', $html->url('/users', true)));

完美无缺。