Précédent   Forum des professionnels en informatique > PHP > Langage > Sessions
Sessions Forum d'entraide sur les sessions avec PHP. Avant de poster -> FAQ sessions, Cours sessions et Sources sécurité
Partagez cette discussion sur d'autres réseaux sociaux : Viadeo Twitter Google Facebook Digg Delicious MySpace Yahoo
Réponse Proposer ce sujet en actualité
 
Outils de la discussion
Publicité
'
Vieux 31/10/2006, 22h03   #1
Futur Membre du Club
 
Inscription : octobre 2006
Messages : 18
Détails du profil
Informations personnelles :
Âge : 28
Localisation : France

Informations forums :
Inscription : octobre 2006
Messages : 18
Points : 4
Points : 4
Par défaut [Sécurité] Solution contre des codes malveillants

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);
et j'envisageait d'y faire suivre :
Code :
1
2
 
$mavariable=addslashes($mavariable);
mais on m'a conseillé de plutot appliquer cela :

Code :
1
2
$mavariable = htmlspecialchars($mavariable); // Pour virer les chevrons, etc.
$mavariable = mysql_real_escape_string($mavariable); // Pour protéger la fonction des caractères spéciaux des requêtes SQL.
quelle est la meilleure solution ? y a t il quelquechose de mieux? que me conseillez vous?

merci beucoup
fwebconcept est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 31/10/2006, 23h17   #2
Membre Expert
 
Inscription : janvier 2005
Messages : 1 249
Détails du profil
Informations personnelles :
Localisation : France, Gironde (Aquitaine)

Informations forums :
Inscription : janvier 2005
Messages : 1 249
Points : 1 417
Points : 1 417
Contre les injections sql, une seule méthode est correcte : mysql_real_escape_string().
Extrait du manuel php :
Citation:
mysql_real_escape_string() protège les caractères spéciaux de la chaîne unescaped_string, en prenant en compte le jeu de caractères courant de la connexion link_identifier. Le résultat peut être utilisé sans problème avec la fonction mysql_query().
htmlentities() ne protège pas mysql, il protège le client contre des attaques du type XSS (Cross Site Scripting).
vg33 est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 31/10/2006, 23h31   #3
Futur Membre du Club
 
Inscription : octobre 2006
Messages : 18
Détails du profil
Informations personnelles :
Âge : 28
Localisation : France

Informations forums :
Inscription : octobre 2006
Messages : 18
Points : 4
Points : 4
slt merci de ta reponse, tu me conseille donc quoi ?

mysql_real_escape_string() + htmlentities() ??

ou une autre combinaison?
fwebconcept est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 31/10/2006, 23h36   #4
Membre Expert
 
Inscription : janvier 2005
Messages : 1 249
Détails du profil
Informations personnelles :
Localisation : France, Gironde (Aquitaine)

Informations forums :
Inscription : janvier 2005
Messages : 1 249
Points : 1 417
Points : 1 417
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().
vg33 est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 31/10/2006, 23h45   #5
Futur Membre du Club
 
Inscription : octobre 2006
Messages : 18
Détails du profil
Informations personnelles :
Âge : 28
Localisation : France

Informations forums :
Inscription : octobre 2006
Messages : 18
Points : 4
Points : 4
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?
fwebconcept est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 31/10/2006, 23h52   #6
Membre Expert
 
Inscription : janvier 2005
Messages : 1 249
Détails du profil
Informations personnelles :
Localisation : France, Gironde (Aquitaine)

Informations forums :
Inscription : janvier 2005
Messages : 1 249
Points : 1 417
Points : 1 417
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.
vg33 est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 01/11/2006, 00h18   #7
Membre émérite
 
Inscription : juin 2002
Messages : 1 013
Détails du profil
Informations forums :
Inscription : juin 2002
Messages : 1 013
Points : 959
Points : 959
Citation:
Envoyé par vg33
Contre les injections sql, une seule méthode est correcte : mysql_real_escape_string().
Petite remarque : je ne sais plus ou ni quand, mais j'ai lu que cette fonction doit être utilisée si get_magic_quotes_gpc est faux. C'est pourquoi j'ai récupéré la fonction suivante (ce n'est pas ma création...) :
Code :
1
2
3
4
5
6
7
8
9
function quote_smart($value)
	{
	// Protège la variable lors de l'injection dans mysql
	// Stripslashes
	if (get_magic_quotes_gpc()) $value = stripslashes($value);
	// Protection si ce n'est pas une valeur numérique ou une chaîne numérique
	if (!is_numeric($value)) $value = "'" . mysql_real_escape_string($value) . "'";
	return $value;
	}
francis m est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 01/11/2006, 00h26   #8
Membre Expert
 
Inscription : janvier 2005
Messages : 1 249
Détails du profil
Informations personnelles :
Localisation : France, Gironde (Aquitaine)

Informations forums :
Inscription : janvier 2005
Messages : 1 249
Points : 1 417
Points : 1 417
Citation:
Envoyé par vg33
Avant insertion en bdd : uniquement mysql_real_escape_string(), avec un stripslashes() si magic_quotes_gpc est à ON.
Oui, je l'avais déjà écrit
vg33 est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 01/11/2006, 00h29   #9
Futur Membre du Club
 
Inscription : octobre 2006
Messages : 18
Détails du profil
Informations personnelles :
Âge : 28
Localisation : France

Informations forums :
Inscription : octobre 2006
Messages : 18
Points : 4
Points : 4
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?
fwebconcept est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 01/11/2006, 00h38   #10
Membre Expert
 
Inscription : janvier 2005
Messages : 1 249
Détails du profil
Informations personnelles :
Localisation : France, Gironde (Aquitaine)

Informations forums :
Inscription : janvier 2005
Messages : 1 249
Points : 1 417
Points : 1 417
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.
vg33 est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 01/11/2006, 13h09   #11
Futur Membre du Club
 
Inscription : octobre 2006
Messages : 18
Détails du profil
Informations personnelles :
Âge : 28
Localisation : France

Informations forums :
Inscription : octobre 2006
Messages : 18
Points : 4
Points : 4
Citation:
Envoyé par vg33
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().

je ne comprend pas pourquoi il faut utiliser striplashes() (qui es la fonction inverse de addslashes() )
fwebconcept est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 01/11/2006, 13h18   #12
Membre Expert
 
Inscription : janvier 2005
Messages : 1 249
Détails du profil
Informations personnelles :
Localisation : France, Gironde (Aquitaine)

Informations forums :
Inscription : janvier 2005
Messages : 1 249
Points : 1 417
Points : 1 417
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.
vg33 est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 01/11/2006, 13h33   #13
Futur Membre du Club
 
Inscription : octobre 2006
Messages : 18
Détails du profil
Informations personnelles :
Âge : 28
Localisation : France

Informations forums :
Inscription : octobre 2006
Messages : 18
Points : 4
Points : 4
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.
fwebconcept est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 01/11/2006, 14h30   #14
Membre émérite
 
Inscription : juin 2002
Messages : 1 013
Détails du profil
Informations forums :
Inscription : juin 2002
Messages : 1 013
Points : 959
Points : 959
Citation:
Envoyé par fcreation
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?
ce n'est pas vraiment ça :
comme indiqué par vg33
Citation:
Envoyé par vg33
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?
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
francis m est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 01/11/2006, 16h11   #15
Membre Expert
 
Inscription : janvier 2005
Messages : 1 249
Détails du profil
Informations personnelles :
Localisation : France, Gironde (Aquitaine)

Informations forums :
Inscription : janvier 2005
Messages : 1 249
Points : 1 417
Points : 1 417
Citation:
Envoyé par fcreation
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.
Si dans php.ini magic_quotes_gpc est à ON, php échappe automatiquement tes données avant de les mettre dans le tableau $_POST, $_GET ou $_COOKIE. Tes données ne sont donc plus brutes, elles sont déjà échappées. Il faut alors les remettre dans leur état initial (stripslashes()) avant de les échapper à nouveau avec mysql_real_escape_string(). Il est nécessaire d'en passer par là car magic_quotes n'échappe pas tous les caractères dangereux pour mysql, au contraire de mysql_real_escape_string().
vg33 est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 01/11/2006, 16h21   #16
Futur Membre du Club
 
Inscription : octobre 2006
Messages : 18
Détails du profil
Informations personnelles :
Âge : 28
Localisation : France

Informations forums :
Inscription : octobre 2006
Messages : 18
Points : 4
Points : 4
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?
fwebconcept est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 01/11/2006, 16h26   #17
Membre Expert
 
Inscription : janvier 2005
Messages : 1 249
Détails du profil
Informations personnelles :
Localisation : France, Gironde (Aquitaine)

Informations forums :
Inscription : janvier 2005
Messages : 1 249
Points : 1 417
Points : 1 417
Tout à fait. Le htmlentities peut être fait avant insertion en bdd, ou avant affichage, au choix.
vg33 est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 03/11/2006, 18h56   #18
Membre chevronné
 
Avatar de Dia_FR
 
Homme Aurélien
Développeur Web
Inscription : avril 2006
Messages : 510
Détails du profil
Informations personnelles :
Nom : Homme Aurélien
Localisation : France

Informations professionnelles :
Activité : Développeur Web

Informations forums :
Inscription : avril 2006
Messages : 510
Points : 643
Points : 643
ptite question :

j'me suis fait une fonction de connexion :
Code :
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
function RequeteSQL($Requete) {
 
  $IdentifiantConnexion = mysql_connect(_BD_SERVEUR, _BD_UTILISATEUR, _BD_MOT_PASSE)
  or die('<br /><br />Impossible de se connecter &agrave; ce serveur (' . _BD_SERVEUR . ') avec ce login (' . _BD_UTILISATEUR . ') !<br /><br />Erreur retourn&eacute;e : ' . mysql_error());
 
  mysql_select_db(_BD_UTILISATEUR, $IdentifiantConnexion)
  or die('<br /><br />Impossible de se connecter &agrave; cette base de donn&eacute;es (' . _BD_UTILISATEUR . ') !<br /><br />Erreur retourn&eacute;e : ' . mysql_error());
 
  $ResultatsRequete = mysql_query($Requete, $IdentifiantConnexion)
  or die ('<br /><br />Impossible d\'ex&eacute;cuter cette requ&ecirc;te (' . $Requete . ') !<br /><br />Erreur retourn&eacute;e : ' . mysql_error());
 
  mysql_close($IdentifiantConnexion);
 
  return $ResultatsRequete;
 
}
donc à l'appel ça donne par exemple :
Code :
$InformationsPages = RequeteSQL("SELECT `Titre`, `Description`, `MotsCles` FROM `EntetesPages` WHERE `Identifiant`='$IdentifiantPage';");
donc, si je mets
Code :
$Requete = mysql_real_escape_string($Requete, $IdentifiantConnexion);
dans ma fonction, après le mysql_connect et avant le mysql_query, j'obtiens une erreur, il peut pas exécuter cette requête :
Code :
SELECT `Titre`, `Description`, `MotsCles` FROM `EntetesPages` WHERE `Identifiant`=\'News\';
normal, il a échappé les simple quotes qui délimitent la valeur du champ


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
__________________
Dia [ Page DVP ] [ Blog ] [ Site pro ]
Dia_FR est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 03/11/2006, 19h32   #19
Membre Expert
 
Inscription : janvier 2005
Messages : 1 249
Détails du profil
Informations personnelles :
Localisation : France, Gironde (Aquitaine)

Informations forums :
Inscription : janvier 2005
Messages : 1 249
Points : 1 417
Points : 1 417
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).'"'
vg33 est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 03/11/2006, 20h55   #20
Membre chevronné
 
Avatar de Dia_FR
 
Homme Aurélien
Développeur Web
Inscription : avril 2006
Messages : 510
Détails du profil
Informations personnelles :
Nom : Homme Aurélien
Localisation : France

Informations professionnelles :
Activité : Développeur Web

Informations forums :
Inscription : avril 2006
Messages : 510
Points : 643
Points : 643
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
__________________
Dia [ Page DVP ] [ Blog ] [ Site pro ]
Dia_FR est déconnecté   Envoyer un message privé Réponse avec citation 00
Réponse Proposer ce sujet en actualité
Outils de la discussion



Fuseau horaire GMT +2. Il est actuellement 22h57.


 
 
 
 
Partenaires

Hébergement Web