JeuWeb - Crée ton jeu par navigateur
Protection des variables & expression régulière - Version imprimable

+- JeuWeb - Crée ton jeu par navigateur (https://jeuweb.org)
+-- Forum : Discussions, Aide, Ressources... (https://jeuweb.org/forumdisplay.php?fid=38)
+--- Forum : Programmation, infrastructure (https://jeuweb.org/forumdisplay.php?fid=51)
+--- Sujet : Protection des variables & expression régulière (/showthread.php?tid=2093)



Protection des variables & expression régulière - Plume - 04-12-2007

Coucou !

Désolé de ne pas vous l'avoir dit plutôt mais en PHP, je suis un assisté :oops:

J'ai une question stupide, qui touche au détail & dont je suis à peu près sûr de la réponse.

J'ai une fonction comme suit :
Code PHP :
<?php
/**
* This function gives security to the variables
* @param array $aVariablesTabs
* @return array Return the array of reassured variables
*/
private function parseVariables( array $aVariablesTabs )
{
if(
get_magic_quotes_gpc() )
{
foreach(
$aVariablesTabs as &$variable )
$variable = stripslashes( $variable );
}

foreach(
$aVariablesTabs as &$variable )
$variable = mysql_real_escape_string( $variable );

return
$aVariablesTabs;
}
?>

Une fois que mes variables sont passées à la moulinette, je les passe dans une expression régulière comme ceci :
Code PHP :
<?php
/**
* Verify the validity of the email submited
* @param string $mailSubmited
* @return bool Return FALSE if an error is occured; TRUE if not.
*/
function checkMail( string $mailSubmited )
{
$mailSubmited = $this -> parseVariables( $mailSubmited );
if(
ereg('^[-!#$%&\'*+\\./0-9=?A-Z^_`a-z{|}~]+' .
'@' .
'[-!#$%&\'*+\\/0-9=?A-Z^_`a-z{|}~]+\.' .
'[-!#$%&\'*+\\./0-9=?A-Z^_`a-z{|}~]+$' ,
$mailSubmited ) )
{
$aErrors[] = REGISTRATION_MAIL_ERROR;
return
FALSE;
}

$sqlInstance = Factory::Instanciate( 'MySQLDatabase' , 'include/configDB.php' );

$sQuery = 'SELECT id_players FROM ' . TABLE_PLAYERS . ' WHERE email = \'' . $mailSubmited . '\'';
$rQuery = $sqlInstance -> executeRequest( $sQuery );

$sqlResultInstance = Factory::Instanciate( 'MySQLResult' , $rQuery );
if(
$sqlResultInstance -> numberRows() === 1 )
{
$aErrors[] = REGISTRATION_MAIL_ERROR2;
return
FALSE;
}
else
return
TRUE;
}
?>
Donc $mailSubmited pourrait avoir des caractères échappés. Et la question est : Je suis bien obligé de les prendre en compte dans mon expression régulière, non ? Je pense que oui, mais sait-on jamais. PHP est p'tet magique Smile

Question subsidiaire : Si je suis obligé de les prendre en compte, les caractères échappés, comment je fais pour que ça ne me dise pas que ma valeur ne vérifie pas mon expression ? En gros, une expression régulière qui soit suffisamment générale.

Note : J'ai pris un exemple que j'ai développé. En réalité, je ne fais pas la transformation des variables avant de les soumettre à l'expression régulière. C'était juste pour la situation. Et la question, c'est juste pour la `culture' ( ? ) Smile

~L~


RE: Protection des variables & expression régulière - naholyr - 04-12-2007

L'erreur c'est que tu fais deux choses totalement différentes :
1. Vérifier la validité syntaxique de l'email (il ne faut donc RIEN échapper ici, évidemment)
2. Vérifier que l'adresse e-mail est déjà utilisée (il faut donc ici échapper la variable avec mysql_real_escape_string()).

Dans chacune de ces vérifications (qui devraient a priori faire l'objet d'une méthode chacune), tu ne dois partir de la variable "pure" telle qu'envoyée par le visiteur, et ensuite la travailler (dans le cas 1, aucune modif, dans le cas 2 il faut l'échapper avant de lancer la requête).


RE: Protection des variables & expression régulière - Plume - 04-12-2007

Non, mais c'était juste pour la question xD

En réalité, je fais comme ça :
Code PHP :
<?php
/**
* Verify the validity of the email submited
* @param string $mailSubmited
* @return bool Return FALSE if an error is occured; TRUE if not.
*/
function checkMail( string $mailSubmited )
{
if(
ereg('^[-!#$%&\'*+\\./0-9=?A-Z^_`a-z{|}~]+' .
'@' .
'[-!#$%&\'*+\\/0-9=?A-Z^_`a-z{|}~]+\.' .
'[-!#$%&\'*+\\./0-9=?A-Z^_`a-z{|}~]+$' ,
$mailSubmited ) )
{
$aErrors[] = REGISTRATION_MAIL_ERROR;
return
FALSE;
}

$sqlInstance = Factory::Instanciate( 'MySQLDatabase' , 'include/configDB.php' );
$mailSubmited = $this -> parseVariables( $mailSubmited );

$sQuery = 'SELECT id_players FROM ' . TABLE_PLAYERS . ' WHERE email = \'' . $mailSubmited . '\'';
$rQuery = $sqlInstance -> executeRequest( $sQuery );

$sqlResultInstance = Factory::Instanciate( 'MySQLResult' , $rQuery );
if(
$sqlResultInstance -> numberRows() === 1 )
{
$aErrors[] = REGISTRATION_MAIL_ERROR2;
return
FALSE;
}
else
return
TRUE;
}
?>

Ceci dit, je ne fais pas 2 méthodes ..
Pourquoi en ferais-je deux ? Je sais bien que celle là fait deux choses, ce qui n'est pas `éthymologiquement' correct mais bon .. Est-ce réellement utile ?

~L~


RE: Protection des variables & expression régulière - naholyr - 04-12-2007

Ça servirait à ce que le "parseVariables" appelé au milieu ne passe pas inaperçu par exemple Wink
Et même au niveau de l'organisation du code et de la sémantique : on a une fonction "isValidMail($email)" qui vérifie classiquement la syntaxe de l'adresse e-mail, et "isAlreadyUsedMail($email)" qui vérifie si l'adresse e-mail est déjà utilisée.
Dans les deux cas on prend une email en paramètre, une chaine, pas une variable passée par $_GET ou $_POST, on n'a pas à s'en préoccuper ici, et donc dans la seconde en toute logique on ne fera pas un addslashes() dessus mais plutôt un mysql_real_escape_string() (ou un escape abstrait) mais pas .

C'est plutôt l'utilité de la fonction parseVariables() (et surtout son nom) que je trouve ici un peu détournée, d'ailleurs dans le deuxième code que tu donnes tu l'utilises sur une chaine de caractère ($mailSubmited) alors qu'elle n'est censée prendre qu'un array Wink

P.S: Submitted en anglais c'est avec deux 't' Tongue


RE: Protection des variables & expression régulière - Plume - 04-12-2007

naholyr a écrit :Ça servirait à ce que le "parseVariables" appelé au milieu ne passe pas inaperçu par exemple Wink
J'vois mal le problème avec le fait qu'il passe inaperçu ..

naholyr a écrit :Et même au niveau de l'organisation du code et de la sémantique : on a une fonction "isValidMail($email)" qui vérifie classiquement la syntaxe de l'adresse e-mail, et "isAlreadyUsedMail($email)" qui vérifie si l'adresse e-mail est déjà utilisée.
Oui, ça j'avais bien compris. C'est justement sur ça que portait ma question. Je cernais déjà cette vision de la chose, mais je m'interrogeais sur la nécessité pour le coup Smile

naholyr a écrit :Dans les deux cas on prend une email en paramètre, une chaine, pas une variable passée par $_GET ou $_POST, on n'a pas à s'en préoccuper ici, et donc dans la seconde en toute logique on ne fera pas un addslashes() dessus mais plutôt un mysql_real_escape_string() (ou un escape abstrait) mais pas .
Il faut quand même bien traité les variables en fonction du fait que les magic quotes sont actives ou pas, non ? Que ce soit avant l'appel de la méthode, c'est pareil.

naholyr a écrit :C'est plutôt l'utilité de la fonction parseVariables() (et surtout son nom) que je trouve ici un peu détournée, d'ailleurs dans le deuxième code que tu donnes tu l'utilises sur une chaine de caractère ($mailSubmited) alors qu'elle n'est censée prendre qu'un array Wink
Pour l'erreur de type, je suis owned ^^ J'avoue.
Mais finalement, mon `perfectionnisme' me reprend. J'vais suivre la logique Big Grin

naholyr a écrit :P.S: Submitted en anglais c'est avec deux 't' Tongue
Ouais bon ça va .. Ca arrive les erreurs Confusediffle: