sécurité, url en parametre & mysql

Répondre


Cette question est un moyen d’empêcher des soumissions automatisées de formulaires par des robots.
Smileys
:D :) :( :o :shock: :? 8-) :lol: :x :P :oops: :cry: :evil: :twisted: :roll: :wink: :!: :?: :idea: :arrow: :| :mrgreen: =D> #-o =P~ :^o :non: :priere: 8-|
Voir plus de smileys
  Revue du sujet
 

  Étendre la vue Revue du sujet : sécurité, url en parametre & mysql

Re: sécurité, url en parametre & mysql

par sylvercis » 17 juil. 2012, 22:30

Bon juste pour info pour ceux que ça intéresserait, le problème avec la regex que j'avais trouvé c'est simplement qu'il manquait les majuscules:

Code : Tout sélectionner

function isValidURL($url) { $urlregex = "#^(https?|ftp)\:\/\/"; // SCHEME $urlregex .= "([a-zA-Z0-9+!*(),;?&=\$_.-]+(\:[a-zA-Z0-9+!*(),;?&=\$_.-]+)?@)?"; // USER AND PASS (optional) // HOSTNAME OR IP $urlregex .= "[a-zA-Z0-9+\$_-]+(\.[a-zA-Z0-9+\$_-]+)*"; // http://x = allowed (ex. http://localhost, http://routerlogin) //$urlregex .= "[a-zA-Z0-9+\$_-]+(\.[a-zA-Z0-9+\$_-]+)+"; // http://x.x = minimum //$urlregex .= "([a-zA-Z0-9+\$_-]+\.)*[a-zA-Z0-9+\$_-]{2,3}"; // http://x.xx(x) = minimum //use only one of the above $urlregex .= "(\:[0-9]{2,5})?"; // PORT (optional) $urlregex .= "(\/([a-zA-Z0-9+\$_-]\.?)+)*\/?"; // PATH (optional) $urlregex .= "(\?[a-zA-Z+&\$_.-][a-zA-Z0-9;:@/&%=+\$_.-]*)?"; // GET Query (optional) $urlregex .= "(\#[a-zA-Z_.-][a-zA-Z0-9+\$_.-]*)?\$#"; // ANCHOR (optional) // test if (preg_match($urlregex, $url)) {return true;} else {return false;} }
Après a forcer de chercher j'ai trouvé pourquoi filter_var(validate_url) n'est pas fiable:
filter_var in PHP

In PHP 5 there is a function called filter_var which allows you to test a piece of data against a filter. One of the filters is FILTER_VALIDATE_URL and this seems like the obvious case to use. It's usage would be something like:

$result = filter_var($url, FILTER_VALIDATE_URL, FILTER_FLAG_SCHEME_REQUIRED);

Simple, right? The issue is with how this works. FILTER_VALIDATE_URL attempts to pass the URL through parse_url and see if it can break the URL down. In the documentation of parse_url it says, "This function is not meant to validate the given URL".

Additionally, if you test this you'll find urls like "http://", http://... and many other invalid URLs will pass because they have a structure parse_url can handle.
Je suis pas très fort en anglais mais j'ai l'impression que ça veut dire que la fonction filter_validate_url c'est un peu du bricolage.

Ensuite je me suis renseigné sur les normes qui concerne les URLs et c'est compliqué mais il semble que la dernière soit la RFC 3986 et date de 2005
j'ai donc pu trouvé ensuite cette fonction qui valide les url par rapport a cette norme:
http://code.google.com/p/php-rfc-3986/

j'ai également besoin de valider dans mon formulaire donc j'ai trouvé cette fonction javascript pour cette meme norme:
https://github.com/garycourt/uri-js

je donne aussi au passage cette autre regex qui donne de très bon résultat:
https://gist.github.com/729294

Re: sécurité, url en parametre & mysql

par sylvercis » 15 juil. 2012, 15:38

j'ai déjà trouvé des url qui ne passent pas avec ce regex :?

j'avais regardé Filter_var et c'est bien pratique comme fonction mais comme tu le dit toi meme c'est pas complet et ça laisse passer des choses qui ne devrait pas comme ceci par exemple:

Code : Tout sélectionner

http://example.com/"><script>alert(document.cookie)</script>
au moins avec la regex rien ne passe.

je peut aussi essayer de "nettoyer l'url" a l'aide d'un regex après l'avoir passé dans Filter_var.
c'est peut etre la solution la plus sûr.

Re: sécurité, url en parametre & mysql

par moogli » 15 juil. 2012, 11:40

salut,


avec php >= 5.2 tu peux plus simplement utiliser filter_var et le filtre FILTER_VALIDATE_URL
plus de détails : http://fr.php.net/manual/fr/filter.filters.validate.php

l'avantage ? peut être des cas non pensé dans ton expreg, rapidité d'un code natif ;)

seul bémol
Valide une URL (selon » http://www.faqs.org/rfcs/rfc2396), éventuellement avec des composants requis. Cette fonction ne trouvera que des URLs ASCII valides, les domaines internationalisés (contenant des caractères non-ASCII) ne fonctionneront pas.
mais il y a des chances que tu ai le même problème avec ton code ;)


@+

Re: sécurité, url en parametre & mysql

par sylvercis » 15 juil. 2012, 10:40

Finalement j'ai trouvé une regex sur le net qui a l'air de bien fonctionner:

Code : Tout sélectionner

function isValidURL($url) { // SCHEME $urlregex = "#^(https?|ftp)\:\/\/"; // USER AND PASS (optional) $urlregex .= "([a-z0-9+!*(),;?&=\$_.-]+(\:[a-z0-9+!*(),;?&=\$_.-]+)?@)?"; // HOSTNAME OR IP $urlregex .= "[a-z0-9+\$_-]+(\.[a-z0-9+\$_-]+)*"; // http://x = allowed (ex. http://localhost, http://routerlogin) //$urlregex .= "[a-z0-9+\$_-]+(\.[a-z0-9+\$_-]+)+"; // http://x.x = minimum //$urlregex .= "([a-z0-9+\$_-]+\.)*[a-z0-9+\$_-]{2,3}"; // http://x.xx(x) = minimum //use only one of the above // PORT (optional) $urlregex .= "(\:[0-9]{2,5})?"; // PATH (optional) $urlregex .= "(\/([a-z0-9+\$_-]\.?)+)*\/?"; // GET Query (optional) $urlregex .= "(\?[a-z+&\$_.-][a-z0-9;:@/&%=+\$_.-]*)?"; // ANCHOR (optional) $urlregex .= "(\#[a-z_.-][a-z0-9+\$_.-]*)?\$#"; // check if (preg_match($urlregex, $url)) {return true;} else {return false;} }
// valid urls
$url = "https://user:[email protected]:808 ... 23#pagetop";
$url = "http://[email protected]/#pagetop";
$url = "https://somewhere.com/index.html";
$url = "ftp://user:****@somewhere.com:21/";
$url = "http://somewhere.com/index.html/"; //this is valid!!

il y a encore quelques rares url qui ne passent pas avec mais pour la plupart c'est ok, je pourrai toujours l'améliorer plus tard suivant les retours que j'aurai a l'utilisation.

merci pour ton aide !

Re: sécurité, url en parametre & mysql

par xTG » 14 juil. 2012, 17:55

Tu peux tester l'url à la rigueur en essayant d'accéder au site.
Si ça te retourne une 404 ou autre c'est que l'url n'est pas valide.

Re: sécurité, url en parametre & mysql

par sylvercis » 14 juil. 2012, 10:39

oui c'est la méthode basique et pour des urls du genre http://www.truc.com ça ne poserait pas de problèmes

Code : Tout sélectionner

$url = mysql_real_escape_string($base_url); if $url=$baseurl { if (filter_var($url, FILTER_VALIDATE_URL)) { // Vérifie si la chaine ressemble à une URL echo 'Cette URL est correct.'; } else { echo 'Cette URL a un format non adapté.'; } } else { echo 'Cette URL a un format non adapté.'; }
mais qu'est ce qui ce passera avec des url comme ça : posting.php?mode=reply&f=8&t=264948
ou des url plus compliqué qui contiennent des url en parametres ?
Est ce que toutes les url possibles passeront le test
et est ce que les url trafiqué contenant soit des balises html ou bien des commandes sql seront bien recalées avec cette méthode?

d'après le peu d'info que j'ai pu trouvé a ce sujet, j'ai l'impression qu'il n'y a pas de méthode bien fiable ?

Re: sécurité, url en parametre & mysql

par xTG » 14 juil. 2012, 00:07

Echapper une variable => mysql_real_escape_string() ;)
Et pour vérifier que c'est bien une url tu peux utiliser preg_match() et une expression régulière.

sécurité, url en parametre & mysql

par sylvercis » 13 juil. 2012, 22:08

Bonjour,

j'ai un formulaire sur mon site pour que l'utilisateur puisse ajouter des liens vers des pages externes.
je transmet l'url par POST
et ensuite je la stocke dans ma base Mysql

ce que je voudrai savoir c'est comment m'y prendre quand je reçois l'url pour la vérifier et ainsi éliminer tout risque d'injection SQL, faille XSS ou autre attaques.
j'ai un peu cherche sur le net et j'ai pas trouve de fonction qui paraisse fiable pour faire ça. J'ai également peur de détériorer les url pendant les vérifs.

Pourriez vous m'aider, ça doit être assez courant ce genre de manip donc je ne pense avoir a inventer une fonction pour ça ?

merci d'avance