logo Homepage
Pages: [1]
  Imprimer  
Auteur Fil de discussion: [PHP/WAMP] preg_match() qui fait des siennes !  (Lu 3452 fois)
lovenunu
Beta testeur

Profil challenge

Classement : 21/54284

Membre Complet
*
Hors ligne Hors ligne
Messages: 171


Voir le profil
« le: 24 Juillet 2012 à 01:07:34 »

Bonjour tout le monde, je n'ai pas l'habitude de poster, mais en m'occupant d'un site web, j'ai été confronté à un petit "bug", peut-on dire ! ( de mon cerveau surement   )
Pour ce problème, j'étais avec une wamp 2.2, avec PHP 5.3.8

Pour enregistrer un membre, j'utilise un petit formulaire et derrière une batterie de tests est censée me protéger de tout mauvais comportement ( volontaire ou non ) du futur membre en question.

Voici mon code de vérification:
Code:
<?php
if(isset($_POST['user_to_add']) and preg_match("#[a-z\s\.]#i"$_POST['user_to_add']) 
and isset(
$_POST['password_to_add']) and preg_match("#[a-z\s]{10}#i",$_POST['password_to_add'])) {
$sql mysql_query("SELECT * FROM membres WHERE login='".$_POST['user_to_add']."'");
$sql mysql_fetch_array($sql);
if(empty($sql)) {
$db->add_membre($_POST['user_to_add'], $_POST['password_to_add']);
$add_noerror TRUE;
}
else $add_error "Le membre ".$_POST['user_to_add']." existe déjà.";
} else if((isset(
$_POST['user_to_add']) and !preg_match("#[a-z\s]#i"$_POST['user_to_add']))  or 
(isset(
$_POST['password_to_add']) and !preg_match("#[a-z\s]{10}#i",$_POST['password_to_add']))) $add_error "L'un des champs est vide ou erroné";
?>

Et ... bon, voici le formulaire, très simpliste, avec juste un mot de passe aléatoire de 10 caractères.
Code:
<h2> Ajouter un membre </h2>
<?php if(isset($add_error)) { print $add_error; unset($add_error); } 
else if(isset(
$add_noerror)) { print "L'utilisateur ".$_POST['user_to_add']." à bien été ajouté."; unset($add_noerror); }  ?>

<form action="./?page=admin" method="post" id="add_membre_form">
<table>
<tr>
<td><label for="user_to_add"> Utilisateur: </label></td>
<td><input type="text" name="user_to_add" /></td>
</tr>
<tr>
<td><label for="password_to_add"> Mot de passe (à noter): </label></td>
<td><input type="text" name="password_to_add" readonly="readonly" value="<?php print substr(md5(ceil(time()*time()*rand(100000000,1000000000000000)/rand(1,100000000))),0,10); ?>"/></td>
</tr>
</table>
<a href="#" onclick="javascript: document.forms['add_membre_form'].submit();"> Ajouter ce membre </a>
</form>

Jusque là, pas de problème ... Sauf que ce fourbe de preg_match me laisse passer des chaines comme: ee", haaa' ( d’ailleurs jolie erreur sql sur celle la   ).
Je ne suis certes, pas du tout connaisseur en regex, mais là ... Y aurait-il une erreur dans mon code, ou est-ce bien un bug de PCRE ?

Merci d'avance de vos réponses !

PS: une solution DIY qui à l'air de bien fonctionner ( pour ceux qui ont le même problème que moi ) : on fait passer $_POST['user_to_add'] et $_POST['password_to_add'] dans un urlencode, et qu'on remplace les ' et - par rien du tout, et on vire aussi les points dans le $_POST['password_to_add']. Et on compare la valeur initiale à la nouvelle.
« Dernière édition: 24 Juillet 2012 à 01:17:48 par lovenunu » Journalisée

Tant pis je remplacerai ma nuit par une sieste.
sarguel
Profil challenge

Classement : 721/54284

Néophyte
*
Hors ligne Hors ligne
Messages: 26


Voir le profil
« #1 le: 24 Juillet 2012 à 01:51:40 »

je ne suis pas un pro des patterns et je ne comprend rien à ta classe de caractère mais je pense qu'en faisant

Code:
<?php preg_match("#^[a-z\s\.]+$#i"$_POST['user_to_add']) ?>

ça passe mieux ( la ton pseudo ne contiendra que des lettres, des espaces et des points

après tu peux modifier le + en {5,10} pour mettre une limite de caractère minimum et maximum ( ici 5 minimum et 10 max )
« Dernière édition: 24 Juillet 2012 à 02:06:33 par sarguel » Journalisée
lovenunu
Beta testeur

Profil challenge

Classement : 21/54284

Membre Complet
*
Hors ligne Hors ligne
Messages: 171


Voir le profil
« #2 le: 24 Juillet 2012 à 02:25:29 »

Oups, j'avais oublié le + en copie/collant mon script :p
Mais en ajoutant soit le ^, soit le $ ça fonctionne ... Je comprends la logique de la regex, qui serait: chaque itération ( donc caractère ) doit commencer par une lettre, un chiffre ou un point.
Merci !
Journalisée

Tant pis je remplacerai ma nuit par une sieste.
harvey

Profil challenge

Classement : 12/54284

Membre Senior
****
Hors ligne Hors ligne
Messages: 316


Voir le profil WWW
« #3 le: 24 Juillet 2012 à 06:08:18 »

Citation
Mais en ajoutant soit le ^, soit le $ ça fonctionne ...
^ matche le début de la ligne et $ la fin (comme expliqué ).
S'il manque l'un ou l'autre, la chaîne peut contenir n'importe quoi:
Code:
php > echo preg_match("/^a+/","aaawtf");
1
php > echo preg_match("/a+$/","wtfaaa");
1
Journalisée

L'entropie vient en mangeant.
Pages: [1]
  Imprimer  
 
Aller à: