2009-09-16 3 views
3

Что лучше всего использовать в cakephp для расширения функции html-> link, чтобы я мог сказать, чтобы вывести безопасную ссылку (https)? Прямо сейчас, я добавил свою собственную функцию secure_link в app_helpers, которая в основном представляет собой копию функции ссылки, но добавляет https к началу. Но кажется, что должен быть лучший способ переопределить метод html-> link, чтобы я мог указать безопасный параметр.Безопасная ссылка cakephp с использованием метода html helper link

http://groups.google.com/group/cake-php/browse_thread/thread/e801b31cd3db809a Я также начал нить на группах Google и кто-то предложил делать что-то вроде

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

, но я не мог получить эту работу.

Просто добавьте, это то, что выводится, когда у меня есть код выше.

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

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

ответ

1

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

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

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

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

Возможно, я делаю это неправильно, но разве это не разрушает цель ссылки? Если у вас есть среда dev, тогда все ссылки будут неправильными. Кроме того, он по-прежнему не работает с полным URL-адресом. – 2009-09-16 16:30:57

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:// к каждой ссылке.

+0

Еще лучше, если ваш сервер перенаправляет небезопасные URL-адреса. – RaYell

+2

У меня уже есть компонент безопасности, настроенный так. Я просто хотел сохранить дополнительную переадресацию для страниц, которые, как я знаю, всегда будут в безопасности. Также, пытаясь вернуться в другую сторону. От https до http.Когда вы перенаправляете кого-то на защищенную страницу, остальное время они просматривают сайт на защищенных страницах, когда накладные расходы не нужны. – 2009-09-16 16:36:56

+0

Да, трафик HTTPS использует большую пропускную способность и, следовательно, медленнее, но вы можете расширить реализацию выше, чтобы автоматически переключать пользователей с HTTPS на HTTP, когда они оставляют защищенное действие/контроллер. Когда может быть создано решение «СУХОЕ», действие проводки вручную, регулирующее ссылки, кажется излишним. Поскольку перенаправление происходит на сервере и почти не замечается клиентом, попытка избежать перенаправления из-за «накладных» проблем звучит немного как преждевременная оптимизация. – deizel

1

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

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

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

1

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

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

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