|
Publicité ' | ||||||||||||||||||||||||
|
|
#1 | ||||
|
Futur Membre du Club
![]() Inscription : octobre 2006 Messages : 18 ![]() |
bonjour voila j'aurait une petit question securitée,
je voulais avoir quelle est la meilleure methode pour eviter toute injection sql et code malveillant. jusqu'a present j'appliquait a toute variable recuperé par la fonction $_GET ou $_POST : Code :
$mavariable=htmlentities($mavariable, ENT_QUOTES); Code :
Code :
merci beucoup |
||||
|
|
00
|
|
|
#2 | |
|
Membre Expert
![]() Inscription : janvier 2005 Messages : 1 249 ![]() |
Contre les injections sql, une seule méthode est correcte : mysql_real_escape_string().
Extrait du manuel php : Citation:
|
|
|
|
00
|
|
|
#3 |
|
Futur Membre du Club
![]() Inscription : octobre 2006 Messages : 18 ![]() |
slt merci de ta reponse, tu me conseille donc quoi ?
mysql_real_escape_string() + htmlentities() ?? ou une autre combinaison? |
|
|
00
|
|
|
#4 |
|
Membre Expert
![]() Inscription : janvier 2005 Messages : 1 249 ![]() |
Avant insertion en bdd : uniquement mysql_real_escape_string(), avec un striplashes() si magic_quotes_gpc est à ON.
Avant affichage de html, y compris des données affichées dans un formulaire : htmlentities(). |
|
|
00
|
|
|
#5 |
|
Futur Membre du Club
![]() Inscription : octobre 2006 Messages : 18 ![]() |
et si avant tout enregistremnt j'applique les 3 fonction a la suite comme ca quand j'affiche je me pose plus de question c'est pas mieux?
derniere question : on m'a dit qu'il falais prefee htmlspecialchars a htmlentities est-ce vrai? |
|
|
00
|
|
|
#6 |
|
Membre Expert
![]() Inscription : janvier 2005 Messages : 1 249 ![]() |
Le problème avec htmlentities() avant insertion en bdd, c'est que tes données ne sont plus brutes. Cela pose des problèmes si tu fais des recherches sur ces données, ou si tu veux stocker du html. Dans le cas contraire, tu peux le faire avant.
Cependant, il ne faut pas oublier de faire htmlentities() avant d'afficher de nouveau un formulaire précomplété suite à une erreur (sinon, risque de XSS). C'est peut-être plus sûr de faire passer systématiquement par htmlentities() toute donnée utilisateur avant affichage, qu'elle soit GPC ou extraite de bdd (ce qui est souvent le même, d'ailleurs). Pour la différence entre htmlentities() et htmlspecialchars(), je te renvoie au manuel. |
|
|
00
|
|
|
#7 | |||
|
Membre émérite
![]() Inscription : juin 2002 Messages : 1 013 ![]() |
Citation:
Code :
|
|||
|
|
00
|
|
|
#8 | |
|
Membre Expert
![]() Inscription : janvier 2005 Messages : 1 249 ![]() |
Citation:
|
|
|
|
00
|
|
|
#9 |
|
Futur Membre du Club
![]() Inscription : octobre 2006 Messages : 18 ![]() |
slt merci a tout les deux de vos reponse
j'ai plusieur question : pour vg33: -que signifie GPC ? - a quoi sert d'appliquer htmlentities avant de l'afficher dans un formulaire des donées inscrite dan sla bdd qui sont deja passé avant enregitrement par htmlentities() pour francis : a propos de la fonctin qu etu propose si j'ai bien compris elle controle l'etat de magic_quotes_gpc () si c'est on elle appplqiue stripslashes sinon elle fait rien et la deuxieme controle si 'cest uniquement des donées numerique et si oui elle applique mysql_real_escape_string(). c'est bien ca? dans quel cas faut il l'utiliser? |
|
|
00
|
|
|
#10 |
|
Membre Expert
![]() Inscription : janvier 2005 Messages : 1 249 ![]() |
GPC = Get Post Cookie = les données utilisateur.
Bien entendu, tu ne passes jamais une donnée 2 fois par htmlentities(). Au mieux, c'est inutile, au pire tu auras un double échappement. Donc soit tu passes tes données par htmlentities() avant le stockage en bdd, soit tu le fais avant affichage, mais pas les deux. |
|
|
00
|
|
|
#11 | |
|
Futur Membre du Club
![]() Inscription : octobre 2006 Messages : 18 ![]() |
Citation:
je ne comprend pas pourquoi il faut utiliser striplashes() (qui es la fonction inverse de addslashes() ) |
|
|
|
00
|
|
|
#12 |
|
Membre Expert
![]() Inscription : janvier 2005 Messages : 1 249 ![]() |
Parce que magic_quotes, addslashes() et mysql_real_escape_string() échappent tous les 3 les simples quotes. Tu risques donc d'avoir un double ou triple échappement. Si magic_quotes_gpc est à ON, tu passes un coup de stripslashes() pour annuler son action, et donc tu récupères des données brutes. Tu peux donc ensuite passer par mysql_real_escape_string() sans risque.
|
|
|
00
|
|
|
#13 |
|
Futur Membre du Club
![]() Inscription : octobre 2006 Messages : 18 ![]() |
dsl d'etre long a comprendre mais si j'applique =mysql_real_escape_string() sur une donnée brute, (et entuelment suivit de htmlentities() )et que j'enregistre mes données desuite apres dans ma bdd, je vois pas comment je peut avoir des double ou triple échappement.
|
|
|
00
|
|
|
#14 | ||
|
Membre émérite
![]() Inscription : juin 2002 Messages : 1 013 ![]() |
Citation:
comme indiqué par vg33 et si ce sont uniquement des données numériques, la fonction n'applique PAS mysql_real_escape_string() : sans intérêt. Cela ne s'apllique que pour des données texte. Et je l'utilise au moment où je fais ma requête mysql |
||
|
|
00
|
|
|
#15 | |
|
Membre Expert
![]() Inscription : janvier 2005 Messages : 1 249 ![]() |
Citation:
|
|
|
|
00
|
|
|
#16 |
|
Futur Membre du Club
![]() Inscription : octobre 2006 Messages : 18 ![]() |
ok merci beaucoup vg33, je crois que j'ai enfin tout compris :
donc je recupere ms données puis j'applique 1/ stripslashes() ->je vire tout les anti-slash eventuels (si magic_quotes_gpc est à ON.) 2/ mysql_real_escape_string() -> je bloque toute tentative d'injection sql 3/ htmlspecialchars() ->je bloque toute faille XSS mais je conserve les caractere dit speciaux contrairemnt a htmlentities je peux alors enregistrer mes données sans soucis. c'est bien ca? |
|
|
00
|
|
|
#17 |
|
Membre Expert
![]() Inscription : janvier 2005 Messages : 1 249 ![]() |
Tout à fait. Le htmlentities peut être fait avant insertion en bdd, ou avant affichage, au choix.
|
|
|
00
|
|
|
#18 | ||
|
Membre chevronné
![]() ![]() Aurélien Développeur Web Inscription : avril 2006 Messages : 510 ![]() |
ptite question :
j'me suis fait une fonction de connexion : Code :
Code :
$InformationsPages = RequeteSQL("SELECT `Titre`, `Description`, `MotsCles` FROM `EntetesPages` WHERE `Identifiant`='$IdentifiantPage';"); Code :
$Requete = mysql_real_escape_string($Requete, $IdentifiantConnexion); Code :
SELECT `Titre`, `Description`, `MotsCles` FROM `EntetesPages` WHERE `Identifiant`=\'News\';
comment c'est y que j'fais ? merci d'avance pasque ça fait un petit moment que cette question me trotte dans la tête |
||
|
00
|
|
|
#19 |
|
Membre Expert
![]() Inscription : janvier 2005 Messages : 1 249 ![]() |
Tu dois passer tes données par mysql_real_escape_string(), pas ta requête.
C'est logique : cette fonction sert à neutraliser les caractères qui pourraient être interprétés comme du langage SQL. Si tu y passe ta requête, tout sera échappé, et donc plus rien ne fonctionne. Dans ton exemple, il faut faire : Code :
$RequeteSQL='SELECT `Titre`, `Description`, `MotsCles` FROM `EntetesPages` WHERE `Identifiant`="'.mysql_real_escape_string($IdentifiantPage).'"' |
|
|
00
|
|
|
#20 |
|
Membre chevronné
![]() ![]() Aurélien Développeur Web Inscription : avril 2006 Messages : 510 ![]() |
ouais ok
du coup ça va pas marcher comme j'ai fait, avec une fonction qui fait tout d'un coup vu que mysql_real_escape_string a besoin d'un identification de connexion ouais bon, je sens que je vais faire une classe, ça sera plus simple $o->connecter() $r = "..." . mysql_real_escape_string(...) . "..." $o->requete $o->deconnecter bon, c'est parti, merci pour la réponse |
|
00
|
Copyright © 2000-2012 - www.developpez.com