2009-01-07 7 views
0

J'ai une application qui prend des décisions basées sur une partie URL:PHP - paramètres de fixation dans l'URL

if (isset($this->params['url']['url'])) { 
    $url = $this->params['url']['url']; 
    $url = explode('/',$url); 
    $id = $this->Provider->getProviderID($url[0]); 

    $this->providerName = $url[0]; //set the provider name 

    return $id; 

    } 

Cela arrive à être dans une application de gâteau si $ this-> params [ « url »] contient un élément d'URL. J'utilise ensuite l'élément de l'URL afin de décider quelles données utiliser dans le reste de mon application. Ma question est ...

quelle est la meilleure façon de sécuriser cette entrée afin que les gens ne puissent pas passer quelque chose de méchant?

merci,

+0

Veuillez définir "quelque chose de méchant". Quelque chose qu'un Regex n'obtiendra pas? – Karsten

Répondre

1

D'autres commentaires ici sont corrects, dans beforeFilter de AppController valider le fournisseur contre les fournisseurs dans votre db.

Cependant, si toutes les URL doivent être préfixées avec une chaîne de fournisseur, vous allez l'extraire de l'URL en regardant dans $ this-> params ['url'].

Ce type de problème est exactement ce que la classe de routeur, et c'est la capacité de passer des paramètres à une action est pour. Consultez la page de manuel dans le livre de cuisine http://book.cakephp.org/view/46/Routes-Configuration. Vous pouvez essayer quelque chose comme:

Router::connect('/:provider/:controller/:action'); 

Vous verrez également dans le manuel la possibilité de valider le fournisseur sur la route param lui-même par une expression régulière - si vous avez une petite liste définitive des fournisseurs connus, vous pouvez effectuer codez-les dans la regex de la route.En configurant une route qui capture cette partie de l'URL, elle devient instantanément disponible dans $ this-> params ['provider'], mais mieux encore, la méthode html helper link() construit automatiquement URL correctement formatées, par exemple

$html->link('label', array(
    'controller' => 'xxx', 
    'action' => 'yyy', 
    'provider' => 'zzz' 
)); 

Cela renvoie un lien comme/zzz/xxx/yyy

1

Quels sont les noms de fournisseurs valides? Testez si le paramètre d'URL est un, sinon le rejeter.

Espérons que vous êtes conscient qu'il n'y a absolument aucun moyen d'empêcher l'utilisateur de soumettre quoi que ce soit, y compris les noms de fournisseurs qu'ils ne sont pas censés utiliser.

1

je voudrais réitérer le commentaire de Karsten: définir « quoi que ce soit méchant »

Qu'est-ce que vous attendez le paramètre à? Si vous pensez qu'il s'agit d'une URL, utilisez une expression régulière pour valider les URL. Si vous attendez un entier, placez-le dans un entier. Même chose pour un flotteur, booléen, etc.

Ces fonctions PHP peuvent être utiles si: www.php.net/strip_tags www.php.net/ctype_alpha

1

le paramètre sera un providername - alphanumérique chaîne. Je pense que la réponse est essentiellement d'utiliser ctype_alpha() en combinaison avec une vérification que le providername est valide, basé sur une autre logique d'application.

merci pour les réponses

+0

N'oubliez pas de faire aussi mysql_real_escape_string. –

+0

Ou utilisez des objets PDO pour les versions plus récentes –

0

Aussi, si vous avez un ensemble connu d'URL admissibles, une bonne idée est de whitelist les URL autorisées. Vous pouvez même le faire dynamiquement en ayant une table DB qui contient les URL autorisées - tirez-la de la base de données, faites une comparaison avec le paramètre d'URL passé. Vous pouvez également ajouter des modèles à la liste blanche (par exemple, vous avez autorisé les domaines pouvant être transmis, mais le reste de l'URL change ... Vous pouvez ajouter le domaine à la liste blanche et/ou utiliser des expressions rationnelles pour déterminer la validité). À tout le moins, assurez-vous d'utiliser strip_tags, ou les séquences d'échappement mysql intégrées (si vous utilisez PHP5, le paramétrage de vos requêtes SQL résout ces problèmes).

Questions connexes