PHP - Sécuriser les paramètres passés dans l'URL
-
05-07-2019 - |
Question
J'ai une application qui prend des décisions en fonction d'une partie de 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 se trouve dans une application pour gâteau, donc $ 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 ...
Quel est le meilleur moyen de sécuriser cette entrée afin que les gens ne puissent rien transmettre de méchant?
merci,
La solution
Les autres commentaires ici sont corrects: dans beforeFilter d'AppController, validez le fournisseur par rapport aux fournisseurs de votre base de données.
Cependant, si toutes les URL doivent être préfixées avec une chaîne de fournisseur, vous allez extraire l'URL de façon incorrecte en cherchant dans $ this- > params ['url'].
Ce type de problème correspond exactement à la classe de routeur et à sa capacité à transmettre des paramètres à une action. Consultez la page de manuel du livre de recettes 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 paramètre provider dans la route elle-même par une regex - si vous avez une petite liste définie de fournisseurs connus, vous pouvez les coder en dur dans la regex de route.
En configurant un itinéraire qui capture cette partie de l'URL, il devient immédiatement disponible dans $ this- > params ['provider'], mais le meilleur est que la méthode link helper () construit automatiquement URL correctement formatées, par exemple
$html->link('label', array(
'controller' => 'xxx',
'action' => 'yyy',
'provider' => 'zzz'
));
Ceci retourne un lien comme / zzz / xxx / yyy
Autres conseils
Quels sont les noms de fournisseur valides? Tester si le paramètre d'URL est un, sinon le rejeter.
J'espère que vous savez qu'il n'y a absolument aucun moyen d'empêcher l'utilisateur de soumettre quelque chose, y compris les noms de fournisseurs qu'il n'est pas censé utiliser.
Je répète le commentaire de Karsten: définissez "n'importe quoi méchant"
Qu'attendez-vous du paramètre? Si vous vous attendez à ce qu'il s'agisse d'une URL, utilisez une expression régulière pour valider les URL. Si vous attendez un entier, convertissez-le en un entier. Même chose pour un float, un booléen, etc.
Ces fonctions PHP pourraient être utiles cependant: www.php.net/strip_tags www.php.net/ctype_alpha
le paramètre sera une chaîne providername - alphanumeric. Je pense que la solution consiste essentiellement à utiliser ctype_alpha () en combinaison avec une vérification de la validité du nom de provid, basé sur une autre logique d'application.
merci pour les réponses
De même, si vous avez un ensemble connu d'URL autorisées, une bonne idée est de les inclure dans la liste blanche. Vous pouvez même le faire de manière dynamique en disposant une table de base de données contenant les URL autorisées - extrayez-la de la base de données, puis comparez-la au paramètre d'URL transmis. Vous pouvez également utiliser des modèles de liste blanche (par exemple, vous avez autorisé les domaines pouvant être passés, mais le reste de l’URL a été modifié ... Vous pouvez également ajouter le domaine à la liste blanche et / ou utiliser des expressions rationnelles pour déterminer la validité).
Au minimum, 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).
Il serait plus pratique d'utiliser la classe Sanitize . Dans ce cas, Sanitize :: escape () ou Sanitize :: paranoid () semble approprié.