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,

Était-ce utile?

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é.

Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top