[PhP-SQL]Sécuriser les variables utilisateurs

Résolu/Fermé
Exileur Messages postés 1475 Date d'inscription mercredi 31 août 2011 Statut Membre Dernière intervention 16 décembre 2022 - Modifié par Exileur le 5/11/2011 à 13:15
Exileur Messages postés 1475 Date d'inscription mercredi 31 août 2011 Statut Membre Dernière intervention 16 décembre 2022 - 8 nov. 2011 à 15:51
Bonjour à tous,

Je me pose actuellement cette question :

Comment "bien" sécurisé les variables entrées par les utilisateurs dans les formulaires ?

Alors je sais qu'il y a ces fonctions qui existent, mais je ne sais pas laquelle, lesquelles utiliser.

htmlentities
htmlspecialchars
addslashes
stripslashes

Pour l'échappement avant l'ajout dans une bdd, j'utilise :
mysql_real_escape_string

Mais je ne pense pas que cela soit suffisant.
J'attends vos conseils et remarques =)

Cordialement
Exileur




N'oubliez pas de marquez votre post comme résolut lorsque vous avez eu les réponses à vos questions...
Au royaume des aveugles, les borgnes sont rois.
A voir également:

2 réponses

Bonjour

1- récupération des données
Il faut utiliser stripslashes pour récupérer les variables reçues par $GET, $POST ou $COOKIES si la fonction get_magic_quotes-gpc() rend 1.
En effet, si elle rend 1, ça signifie que le serveur est configuré pour ajouter des slashes devant les apostrophes : dans ce cas et dans ce cas seulement, il FAUT utiliser stripslashes.

2 - enregistrement dans mysql
Il faut utiliser mysql_real_escape_string pour enregistrer les données dans une base de données mysql si les données peuvent contenir des caractères spéciaux (signes de ponctuation, lettres accentuées, données binaires...). C'est inutile (mais sans danger) de le faire si les données ne contiennent de manière certaine que des caractères alphanumériques (non accentués). Par exemple, la fonction MD5 rendant une chaîne constituée uniquement des chiffres 0 à 9 et des lettres a à f, faire mysql_real_escape_string(MD5($password)) comme on voit souvent est inutile: MD5($password) suffit.

Je n'ai jamais, jamais eu besoin de addslashes, qui joue un rôle voisin (mais pas exactement équivalent) à mysql_real_escape_string

3 - affichage
Les fonctions htmlentities et htmlspecialchars ne devraient intervenir qu'au moment d'afficher les données. Personnellement je n'utilise que htmlspecialchars qui ne transforme qu' un minimum de caractères.

Ceci est mon point de vue sur l'utilisation de ces fonctions. Mais chacun a le droit de les utiliser comme il veut. Par exemple, on voit souvent des scripts avec mysql_real_escape_string(htmlentities(stripslashes($variable))). Je crois que ce genre d'empilement de fonctions tient plus de la méthode "dans le doute, ceinture + bretelles" que de la bonne connaissance de leurs rôles.
1
Exileur Messages postés 1475 Date d'inscription mercredi 31 août 2011 Statut Membre Dernière intervention 16 décembre 2022 150
5 nov. 2011 à 21:06
Merci d'avoir encore répondu à mes questionnements, j'y vois déjà un peu plus clair

Donc, pour l'envoi d'information type Login/Password dans une BDD, il faudrait procéder comme ceci ?

if(get_magic_quotes_gpc())
{
$username=mysql_real_escape_string(stripslashes($_POST['username']));
$password = MD5(stripslashes($_POST['password']));
}

else
{
$username = mysql_real_escape_string($_POST['username']);
$password = MD5($_POST['password']);
}

Sauf si un preg_match ou un RegExp vérifies qu'aucun caractère spéciaux n'est présent , il suffirait alors de :

$username = mysql_real_escape_string($_POST['username']);
$password = MD5($_POST['password']);

Quand je récupère les logins/passwords par la suite dans la BDD, htmlspecialchars est-il nécessaire lorsque je l'affiche ?
Ou c'est une fonction qui serait seulement utile par exemple lors de la validation de l'inscription ? genre :

$user = htmlspecialchars ($_POST['username']);
echo 'Bienvenue'.$user;
echo 'Votre inscription est validée';

Merci de prendre le temps de m'expliquer
Cordialement
Exileur
0
if(get_magic_quotes_gpc())
{
$username=mysql_real_escape_string(stripslashes($_POST['username']));
$password = MD5(stripslashes($_POST['password']));
}

else
{
$username = mysql_real_escape_string($_POST['username']);
$password = MD5($_POST['password']);
}
ok pour le principe, mâme si c'est loin d'être optimal. Personellement, je crée uen fonction Recupgpc :
function Recupgpc($chaine) {
  if(get_magic_quotes_gpc()) return stripslashes($chaine);
  return $chaine;
}

$username = Recupgpc($_POST['username']);
$password = Recupgpc($_POST['password']);

// test de validité de $username et $password

// requête sql avec mysql_real_escape_string($username) et MD5($password)


Note qu'il faut vérifier que le login et le password respectent un minimum de règles (longueurs minimale et maximale par exemple, nom "qui ressemble à un nom") AVANT de les insérer dans la base de données.
C'est pour ça que je n'applique pas mysql_real_escape_string et MD5 dès la réception des données mais juste au moment de la requête d'insertion. Pour la vérification, ça n'a pas d'importance car on ne va pas trouver les mots bizarres dans la base s'ils ont été rejetés à l'insertion.

htmlspecialchars reste indispensable lors de l'affichage. Pas vraiment en fait, mais si tu ne comprends pas tout à la lecture de la page de manuel sur cette fonction, utilise-la pour les echo. Rien n'interdit de l'utiliser dès la récupération des données comme tu le proposes, c'est simplement un détournement de la fonction. Ça ne te dispense ni du stripslahes (quand il est utile) ni du mysql_real_escape_string
1
Exileur Messages postés 1475 Date d'inscription mercredi 31 août 2011 Statut Membre Dernière intervention 16 décembre 2022 150
6 nov. 2011 à 00:32
Ok, merci beaucoup pour toutes ces infos et de m'avoir permis d'éclaircir tous ça.

Cordialement
Exileur
0
Exileur Messages postés 1475 Date d'inscription mercredi 31 août 2011 Statut Membre Dernière intervention 16 décembre 2022 150
6 nov. 2011 à 18:38
Coucou,
Je vais te poser une petite question, qui n'a aucun rapport avec le post, qu'elle est l'utilité de la balise <minicode></minicode>, malgré mes recherches, je n'ai rien trouver de concluant.

Merci
0
Je ne connais pas cette balise. D'ailleurs elle ne figure pas dans le standard HTML 4.01 :
http://www.w3.org/TR/1999/REC-html401-19991224/index/attributes.html
0
Exileur Messages postés 1475 Date d'inscription mercredi 31 août 2011 Statut Membre Dernière intervention 16 décembre 2022 150
7 nov. 2011 à 09:39
Ok merci.
J'ai trouvé plus ou moins une explication ici :
http://www.siteduzero.com/forum-83-316948-p1-suggestion-minicode-et-php.html

En gros, la balise pemettrait de collorer du code..
0
Après une petite recherche...
Cette balise est propre au site du zéro. Elle ne fera absolument rien (sauf peut-être des erreurs) si tu essayes de l'utiliser dans tes pages
Voir http://www.siteduzero.com/tutoriel-3-37291-bien-utiliser-le-zcode.html
N'oublie jamais : les bonnes informations ne sont que sur les sites de référence. Tout ce que tu trouves dans les forums et les sites de vulgarisation peut être très utile, mais doit être examiné d'un oeil critique avant d'être accepté.
0