8791 sujets

Développement web côté serveur, CMS

Bonjour tout le monde ^^

Bon, voilà, normalement, l'inscription a mon site est protégée via un javascript ET un PHP, pour éviter que des caractères interdits passent...

A part que je viens d'en voir 2 s'inscrire avec des insertions de script (sans effet, la limite de nombre de caractères dans les tables étant efficaces.)

Mais ce que je comprends pas, c'est que normalement mon code PHP devrait marcher... L'est où le soucis ?

$exp_reg_login= "[^A-Za-z0-9'_ -]";
if (preg_match($exp_reg_login,$login)==1)
{
	$inscriptionOK= false;
	$loginOk= false;
	$affichage .= "<p>votre login contient des caract&egrave;res non-autoris&eacute;s</p>";
};


if($inscriptionOk == false)
{
     //retour du formulaire, avec les champs corrects remplis et les erreurs marqués.
}

Modifié par Lothindil (20 Oct 2011 - 14:11)
Si ça ça vaut comme protection, oui :

$idRune=$_GET['id'];if(preg_match('/[0-9]/',$idRune)){$idRune=intval($idRune);}else{die('Pas bien...');}


Après, quand ce sont des strings que je récupère, j'ai des vérification en regex et un passage en htmlentities. (dans le cas ici, y a une vérification regex qui plante manifestement, et avant le passage en base de données un passage par le htmlentities)

Faudrait plus que ça ? Smiley confus
Modifié par Lothindil (20 Oct 2011 - 15:12)
Vérifier par regex, c'est bien pour vérifier que les données sont conformes en terme de format à ce qu'on attend, mais ça ne remplace pas l'utilisation au préalable de filter_var, ou tout autre fonction de la même même famille (filter_ var_ array, etc...)
Bah Htmlentities() suffit pas ?

J'ai du mal à capter l'intérêt d'un filtre comme "FILTER_SANITIZE_STRING" (Supprime les balises, et supprime ou encode les caractères spéciaux.) par rapport à mon htmlentities sur des strings.

La vérification par regex sur les chiffres die mon script si c'est pas des chiffres donc bon, je vois pas en quoi il est moins efficace qu'un "FILTER_SANITIZE_NUMBER_INT". (à part qu'au moins ma solution en plus de nettoyer fait planter le script qui planterait de toute façon)
kenor a écrit :
le tiret est un caractère spécial donc on échappe \

ah bah voilà sans doute la faute que je cherchais ^^'
Accessoirement, je ne vois pas non plus l'avantage de passer par filter_var par rapport à un regex bien fait. L'un comme l'autre pourront laisser passer que le bon format, sauf que le regex sera surement plus souple.

Sinon pour 0-9 tu peux utiliser is_numeric, c'est fait pour.

par contre, si tu n'utilises pas PDO (que je conseille plus que fortement), il est quand même conseillé d'utiliser mysql_real_espace_string ( http://php.net/manual/fr/function.mysql-real-escape-string.php ) pour sécuriser tes inserts.
kenor a écrit :
Accessoirement, je ne vois pas non plus l'avantage de passer par filter_var par rapport à un regex bien fait.
Peux-être parce qu'avec une regex on a vite fait d'écrire un pattern qui semble matcher alors qu'il va laisser passer un cas particulier. Et que filter_var a été ajouté au langage dans un souci de sécurité et sera donc mis à jour en cas de faille, alors que ta regex, personne ne la lira jamais pour te dire si elle est foireuse.


Rien ne t'empêche d'utiliser mysql_real_espace_string + filter, bien au contraire, doubler les sécu n'est jamais un mal.
Bah oui, mais à l'inverse ma regex a une souplesse et une précision que n'a pas les filters. Les filtres sont figés sur des limitations réfléchies par les programmeurs pour des conditions classiques.

Dans mon cas, j'ai un lot de validation assez intéressant et très variés :
- login : qui doit faire une certaine longueur (entre 4 et 25 caractères), qui est composé de lettres et de chiffres, avec comme seuls caractères "spéciaux" possible _ et -
- mot de passe : qui doit faire une certaine longueur (entre 6 et 50 caractères), lettre chiffres, caractères spéciaux sauf marqueur de balise (< et >) autorisé.
- email : qui doit coller à un adresse email
- pseudo : qui doit faire une certaine longueur (entre 4 et 40 caractères), lettres, pas de chiffres, - et _ possibles.
- race, classe, sexe : qui doit rentrer dans une liste prédéfinie.

Honnêtement, à part par pour le email, y a aucun filtre qui me permet de vérifier que mes variables correspondent à ce que je recherche...

Les seuls filtres qui permettent d'ailleurs de valider un string (pas un mail, une IP ou une URL, un simple string) sont des filtres de nettoyage, et donc ça ne valide pas que la chaîne est bonne, ça fait du nettoyage.
Les deux ne sont pas exclusifs. Tu récupères ton GET ou POST. Tu lui appliques le FILTER_SANITIZE_QUIVABIEN. Puis tu utilises un FILTER_VALIDATE_QUIVABIEN si il y en a un qui correspond à tes besoins (ex: mail) ou une regex ou tout autre fonction maison pour tes types "exotiques". Puis un mysql_real_espace_string lors de tes INSERT en base.