2009-09-16 5 views
3

Quelle est la meilleure façon dans cakephp d'étendre la fonction html-> link pour que je puisse lui indiquer de sortir un lien sécurisé (https)? À l'heure actuelle, j'ai ajouté ma propre fonction secure_link à app_helpers qui est en fait une copie de la fonction de lien, mais en ajoutant un https au début. Mais il semble qu'il devrait y avoir un meilleur moyen de contourner la méthode html-> link pour que je puisse spécifier une option sécurisée.cakephp lien sécurisé utilisant la méthode de lien html helper

http://groups.google.com/group/cake-php/browse_thread/thread/e801b31cd3db809a J'ai aussi commencé un fil sur les groupes Google et quelqu'un a suggéré faire quelque chose comme

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

mais je ne pouvais pas obtenir ce travail. Juste pour ajouter, c'est ce qui est sorti lorsque j'ai le code ci-dessus.

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

Je pense qu'il ya un bug dans le gâteau/libs/router.php en ligne 850. Il y a un mot-clé « nue » et je pense qu'il devrait être « base » Bien que le changement à la base ne semble pas répare le. De ce que je comprends, il est dit d'exclure les clés qui sont passées afin qu'elles ne soient pas incluses en tant que paramètres. Mais je suis perplexe quant à la raison pour laquelle c'est un mot-clé "nu" et la seule raison que je peux trouver est que c'est un type.

Répondre

1

Si vous souhaitez remplacer la base, vous devez également spécifier le nom du serveur, pas seulement le protocole.

Si le lien que vous voulez créer devrait être https://example.com/mysite/users/action alors https://example.com/mysite/ est votre base.

Essayez d'exécuter ce code:

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

Peut-être que je le fais mal mais ne va pas à l'encontre du but de lien alors? Si vous avez un environnement de développement, tous les liens seront erronés. En outre, cela ne fonctionne toujours pas avec l'URL complète. –

2

simplement un lien vers la version sécurisée d'une page n'empêche pas pleinement accès à la version non sécurisée, donc une meilleure approche pourrait consister à mettre en œuvre la commutation automatique pour https les actions nécessaires.

<?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')); 
    } 
} 
?> 

En utilisant cette technique, vous pouvez choisir les contrôleurs/actions doivent assurée sans avoir à vous soucier de préfixer https:// à chaque lien.

+0

Il est même préférable que votre serveur redirige les URL non sécurisées. – RaYell

+2

J'ai déjà configuré le composant de sécurité comme ça. Je voulais juste enregistrer la redirection supplémentaire pour les pages que je sais sera toujours sécurisé. Aussi, en essayant de revenir dans l'autre sens. De https à http.Une fois que vous êtes redirigé vers une page sécurisée, le reste du temps, ils surfent sur le site dans des pages sécurisées lorsque les frais généraux ne sont pas nécessaires. –

+0

Oui, le trafic HTTPS utilise plus de bande passante et est donc plus lent, mais vous pouvez étendre l'implémentation ci-dessus pour qu'il passe automatiquement des utilisateurs de HTTPS à HTTP lorsqu'ils quittent une action/un contrôleur sécurisé. Lorsqu'une solution de blanchet «SEC» peut être créée, le fait de passer du temps à ajuster manuellement les liens semble redondant. Étant donné que la redirection se produit sur le serveur et est à peine remarquée par le client, essayer d'éviter la redirection en raison de problèmes de «surcharge» ressemble un peu à une optimisation prématurée. – deizel

1

Dans _forceSecure(), il est préférable d'utiliser cette ligne pour rediriger:

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

Sinon, vous perdrez tous les paramètres spécifiés dans une requête GET.

1

Le mieux que je pouvais trouver pour cela est la suivante:

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

fonctionne parfaitement.