безопасная ссылка CakePHP с использованием метода вспомогательной ссылки HTML - PullRequest
3 голосов
/ 16 сентября 2009

Какой лучший способ в cakephp расширить функцию html-> link, чтобы я мог скажите, чтобы он выводил безопасную (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>

Я думаю, что в файле cake / libs / router.php в строке 850 есть ошибка. Есть ключевое слово «голое», и я думаю, что оно должно быть «базовым», хотя изменение его на базовое, похоже, не исправляет. Из того, что я понял, это говорит об исключении тех ключей, которые передаются, чтобы они не включались в качестве параметров. Но я озадачен тем, почему это ключевое слово «голое», и единственная причина, по которой я могу придумать, заключается в том, что это тип.

Ответы [ 4 ]

2 голосов
/ 16 сентября 2009

Простая ссылка на защищенную версию страницы не полностью препятствует доступу к незащищенной версии, поэтому лучшим подходом может быть внедрение автоматического переключения 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 голос
/ 21 мая 2014

Лучшее, что я мог придумать, это следующее:

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

Отлично работает.

1 голос
/ 27 октября 2009

В _forceSecure () было бы лучше использовать эту строку для перенаправления:

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

В противном случае вы потеряете все параметры, указанные в GET-запросе.

1 голос
/ 16 сентября 2009

Если вы хотите переопределить базу, вы должны указать также имя сервера, а не только протокол.

Если ссылка, которую вы хотите создать, должна быть https://example.com/mysite/users/action, тогда https://example.com/mysite/ - ваша база.

Попробуйте запустить этот код:

$html->link('my account', 
    array('base' => 'https://example.com/mysite/', 'controller' => 'users'));
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...