J'ai un accès à php.ini ,es que je doit mettre les magic quotes en OFF ?
En théorie oui, d'autant plus qu'à partir de PHP 6, ils seront définitivement supprimés.
Donc oui, tu peux les mettre à OFF.
$ pseudo = mysql_real_escape_string ($ _GET [ 'pseudo']);
$ requete = mysql_query ( "SELECT age FROM membres WHERE pseudo = '$ pseudo'");
En théorie, c'est assez sécurisé si, et seulement si, tu utilises la fonction
mysql_real_escape_string() et que tu entoures ta variable ensuite de simples guillemets.
Par contre, pour éviter les erreurs de Type
Notice et certains bugs, il est préférable de toujours vérifier si la variable est définie avant...
Il est préférable aussi de prendre comme habitude aussi de toujours sortir les variables.
Donc:
$pseudo = (isset($_POST['pseudo'])) ? trim($_POST['pseudo']) : null;
if(!empty($pseudo)) {
$requete = mysql_query('SELECT age FROM `membres` WHERE pseudo = ' . "'" . mysql_real_escape_string($pseudo) . "'");
}
$ id = intval ($ _POST [ 'id']);
$ requete = mysql_query ( "SELECT age FROM membres WHERE id = $ id");
Avec une variable contenant un entier, effectivement aucun besoin d'utiliser
mysql_real_escape_string() ou d'entourer la variable de simples guillemets si, et seulement si, on est certain que cette même variable contient bien un entier.
Donc en théorie, en utilisant la fonction
intval(), oui cela est assez sécurisé.
Seul bémol: Vue que tu ne fais aucune autre vérification avant la fonction
intval(), si l'utilisateur envoi un caractère particulier comme un
@ -> cela risque de faire, je croie, planter le script.
Pour moi, l'utilisation de la fonction
intval() dans ces circonstances est une erreur.
Donc je ferais personnellement, comme ceci:
$id = (isset($_POST['id'])) ? trim($_POST['id']) : null;
if(!empty($id) && ctype_digit($id)) {
$requete = mysql_query('SELECT age FROM `membres` WHERE id = ' . $id);
}
Ou si pour une raison particulière, tu as besoin de l'utilisation de la fonction intval() dans ce cas précis:
$id = (isset($_POST['id'])) ? trim($_POST['id']) : null;
if(!empty($id) && ctype_digit($id)) {
$requete = mysql_query('SELECT age FROM `membres` WHERE id = ' . intval($id));
}
Ou encore, si tu veux prendre en compte les lettres aussi:
$id = (isset($_POST['id'])) ? trim($_POST['id']) : null;
if(!empty($id) && ctype_alnum($id)) {
$requete = mysql_query('SELECT age FROM `membres` WHERE id = ' . intval($id));
}
Ou pour finir, si tu veux prendre en compte les "." aussi:
$id = (isset($_POST['id'])) ? trim($_POST['id']) : null;
if(!empty($id) && preg_match('#^[[:alnum:]\.]{1,}$#', $id)) {
$requete = mysql_query('SELECT age FROM `membres` WHERE id = ' . intval($id));
}
Il existe d'autres techniques et habitudes..., ici c'est juste un exemple
[EDIT]
Personnellement, j'ai toujours pris comme habitude en développement de toujours filtrer les données.
C'est à dire: vérifier les caractères des variables avec des
c_type ou des
preg_.
C'est une protection supplémentaire, parfois non indispensable mais souvent la seule solution véritablement fiable.
On est jamais à l'abri d'une erreur, d'un oubli ou d'un élément inconnu...
Sinon:
mysql_real_escape_string n'échappe ni % , ni _ . Ce sont des jokers en MySQL si combinés avec LIKE , GRANT , ou REVOKE .
Si magic_quotes_gpc est activée, appliquez d'abord la fonction stripslashes à vos données