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 29/03/2007, 19h48   #1
Membre habitué
 
Avatar de Alexandrebox
 
Inscription : août 2006
Messages : 613
Détails du profil
Informations forums :
Inscription : août 2006
Messages : 613
Points : 107
Points : 107
Par défaut [Sécurité] Récupérer une variable avec get_magic_quotes_gpc et addslashes

Bonjour tout le monde,

J'ai une question qui va certainement faire l'objet d'un débat.
Je suis entrain de créer un site que j'aimerais bien sécuriser. J'ai vu dans un livre qu'il récupère la variable Get de cette façon

Code livre
Code :
1
2
3
4
 
if (isset($_GET['nom'])) {
  $nom = (get_magic_quotes_gpc()) ? $_GET['nom'] : addslashes($_GET['nom']);
}
alors que presque tout le monde a toujours fait comme ça:

Code de tout le monde
Code :
1
2
3
4
 
if (isset($_GET['nom'])) {
  $nom = $_GET['nom'];
}
A votre avis, est-ce que c'est utile de faire comme dans le livre?
Alexandrebox est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 29/03/2007, 21h14   #2
Membre éclairé
 
Inscription : août 2006
Messages : 379
Détails du profil
Informations personnelles :
Âge : 24

Informations forums :
Inscription : août 2006
Messages : 379
Points : 383
Points : 383
Citation:
Envoyé par Alexandrebox
Code de tout le monde
Code :
1
2
3
4
 
if (isset($_GET['nom'])) {
  $nom = $_GET['nom'];
}
En vérité, très peu de personne qui cherche à sécuriser leurs sites utilisent cette portion de code.
En effet, il faut au minimum vérifié que, dans ce cas, $_GET['nom'] ne contient QUE des lettres.

De plus ... ces deux fonctions n'ont rien à voir.
La première travail la chaine en ajoutant des slashes soit de manières automatiques, soit avec la fonction addslashes().
Alors que la seconde ne fait juste que définir $nom.

P.s : La plus part du temps on met les magic_quotes à 0.
SpiritOfDoc est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 30/03/2007, 00h14   #3
Membre habitué
 
Avatar de Alexandrebox
 
Inscription : août 2006
Messages : 613
Détails du profil
Informations forums :
Inscription : août 2006
Messages : 613
Points : 107
Points : 107
Merci beaucoup. Si j'ai bien compris, c'est ce que je dois faire:

Premier cas Je ne suis pas sûr
Code :
1
2
3
4
5
6
7
8
9
10
 
if (isset($_GET['ID'])) {
 
if(!is_numeric($_GET['ID'])){
 die();
echo "Une erreur est survenue";
}
$ID = $_GET['ID'];
 
}
Je me demande si c'est nécessaire de tester encore la variable par isset?
Etant donné que if(!is_numeric($_GET['ID'])) demande déjà si un nombre numérique est envoyé par GET. Dites-moi si je me trompe. Si je devrais obligatoirement faire les deux (isset et !is_numeric)

Deuxième cas. Je ne suis pas sûr non plus
Code :
1
2
3
4
5
6
7
8
9
10
 
 
if(!is_numeric($_GET['ID'])){
 die();
echo "Une erreur est survenue";
}
else{
$ID = $_GET['ID'];
 
}
Alexandrebox est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 30/03/2007, 08h32   #4
Membre chevronné
 
Avatar de haltabush
 
Développeur Web
Inscription : avril 2005
Messages : 726
Détails du profil
Informations personnelles :
Âge : 27
Localisation : France

Informations professionnelles :
Activité : Développeur Web

Informations forums :
Inscription : avril 2005
Messages : 726
Points : 790
Points : 790
Citation:
Envoyé par SpiritOfDoc
En vérité, très peu de personne qui cherche à sécuriser leurs sites utilisent cette portion de code.
En effet, il faut au minimum vérifié que, dans ce cas, $_GET['nom'] ne contient QUE des lettres.

De plus ... ces deux fonctions n'ont rien à voir.
La première travail la chaine en ajoutant des slashes soit de manières automatiques, soit avec la fonction addslashes().
Alors que la seconde ne fait juste que définir $nom.

P.s : La plus part du temps on met les magic_quotes à 0.
Je ne suis pas trop d'accord.
Sur la plupart des hébergeurs (mutualisés notamment), magic_quotes_gpc est à On, bien que j'ai lu quelque part dans ce forum que l'option disparaitra dans PHP6.
On sera alors contraint d'utiliser à chauqe fois addslashes.
L'intérêt du bout de code
Code :
 $nom = (get_magic_quotes_gpc()) ? $_GET['nom'] : addslashes($_GET['nom']);
est que les slashs de la variables $nom sera correctement échappé quelque soit la configuration du serveur.
haltabush est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 30/03/2007, 09h05   #5
Membre habitué
 
Avatar de Alexandrebox
 
Inscription : août 2006
Messages : 613
Détails du profil
Informations forums :
Inscription : août 2006
Messages : 613
Points : 107
Points : 107
Ok d'accord je comprends.
Mais le fait d'échapper les éventuels noms avec apostrophe ne posera pas de problème à l'affichage?


Je m'explique:
Mon Magic quote est à off. Si je récupère des données d'un formulaire supposons que j'insère directement "aujourd'hui" dans la DB. J'aurai aujourd'ui
alors que si je fais:
Code :
1
2
 
$nom = (get_magic_quotes_gpc()) ? $_GET['nom'] : addslashes($_GET['nom']);
J'aurai dans la DB "aujourd\'ui". Après pour retraiter la variable qu'elle s'affiche correctement.

Pk essayer de faire la barre d'échappement?
Si c'est pour éviter que l'internaute envoie directement une commande sql à la base depuis le formulaire. Ce serai pas mieux de faire comme ça ?

Code :
1
2
3
4
5
6
7
 
if (isset($_GET['nom'])) {
$nom = $_GET['nom'];
 
$sq = "INSERT INTO texte(nom) VALUES('mysql_real_escape_string($_POST['nom'])')";
mysql_query($sq, $idConnex) or die (mysql_error());
}
De cette manière, on a pas des problèmes d'échappement. Mais le code côté DB est sécurisé .
Qu'en penses-tu?
Alexandrebox est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 30/03/2007, 09h24   #6
Membre chevronné
 
Avatar de haltabush
 
Développeur Web
Inscription : avril 2005
Messages : 726
Détails du profil
Informations personnelles :
Âge : 27
Localisation : France

Informations professionnelles :
Activité : Développeur Web

Informations forums :
Inscription : avril 2005
Messages : 726
Points : 790
Points : 790
Effectivement, il est préférable d'utiliser mysql_real_escape_string.
Cependant, il me semble que quand tu mets un addslashes puis que tu envois ta variable à la DB, la variable est correctement enregistrée (sans \). C'est logique puisque celui-ci est interpreté par le SGBD (ex: si tu insert de la manière suivante : "INSERT 'test\'test' INTO ...", tu aura bien test'test d'enregistré)
haltabush est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 30/03/2007, 09h29   #7
Membre habitué
 
Avatar de Alexandrebox
 
Inscription : août 2006
Messages : 613
Détails du profil
Informations forums :
Inscription : août 2006
Messages : 613
Points : 107
Points : 107
Merci pour ta réponse.

Donc le magic quote serait un plus au cas où dans php.ini il serait mis sur on.
Peux-tu me dire si ce code est assez robuste?
Code :
1
2
3
4
5
6
7
 
if (isset($_GET['nom'])) {
$nom = $_GET['nom'];
 
$sq = "INSERT INTO texte(nom) VALUES('mysql_real_escape_string($_POST['nom'])')";
mysql_query($sq, $idConnex) or die (mysql_error());
}
Merci pour ta réponse
Alexandrebox est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 30/03/2007, 09h32   #8
Membre chevronné
 
Avatar de haltabush
 
Développeur Web
Inscription : avril 2005
Messages : 726
Détails du profil
Informations personnelles :
Âge : 27
Localisation : France

Informations professionnelles :
Activité : Développeur Web

Informations forums :
Inscription : avril 2005
Messages : 726
Points : 790
Points : 790
A mon avis, oui, tant que magic_quote_gpc est à Off.
Mais, comme je le disais un peu plus haut, si tu passe ton site en production sur un mutualisé, tu risque d'avoir de mauvaises surprises ensuite
haltabush est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 30/03/2007, 09h35   #9
Membre éclairé
 
Inscription : août 2006
Messages : 379
Détails du profil
Informations personnelles :
Âge : 24

Informations forums :
Inscription : août 2006
Messages : 379
Points : 383
Points : 383
Tu peux aussi le mettre à off (0).
SpiritOfDoc est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 30/03/2007, 09h37   #10
Membre habitué
 
Avatar de Alexandrebox
 
Inscription : août 2006
Messages : 613
Détails du profil
Informations forums :
Inscription : août 2006
Messages : 613
Points : 107
Points : 107
Oui tu as raison, mais même si magic quote est sur on, tant qu'on utilise mysql_real_escape_string($_POST['nom'], on aura aucun problème. Rassure-moi que je n'ai pas tort. Que le code que j'avais écris suffit pour contourner les problèmes de magic quote (on ou off)

Code :
1
2
3
4
5
6
7
8
 
if (isset($_GET['nom'])) {
$nom = $_GET['nom'];
 
$sq = "INSERT INTO texte(nom) VALUES('mysql_real_escape_string($_POST['nom'])')";
mysql_query($sq, $idConnex) or die (mysql_error());
 
}
Alexandrebox est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 30/03/2007, 09h42   #11
Membre éclairé
 
Inscription : août 2006
Messages : 379
Détails du profil
Informations personnelles :
Âge : 24

Informations forums :
Inscription : août 2006
Messages : 379
Points : 383
Points : 383
A vrai dire, vu que je met toujours à off ... je sais pas trop comment ça traite les variables ...
J'ai pris cette habitude au commencement et j'me suis jamais vraiment pausé la question.

Mais selon la définition toute variable est addslashé (ouaw). Donc je pense pas que ça fonctionne correctement ton histoire .

Mais il faudrait tester xD
SpiritOfDoc est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 30/03/2007, 09h42   #12
Membre chevronné
 
Avatar de haltabush
 
Développeur Web
Inscription : avril 2005
Messages : 726
Détails du profil
Informations personnelles :
Âge : 27
Localisation : France

Informations professionnelles :
Activité : Développeur Web

Informations forums :
Inscription : avril 2005
Messages : 726
Points : 790
Points : 790
Je test.

edit:
test.php?nom='sqdf'qsdf
Code :
1
2
3
4
5
6
7
8
9
10
 
require("/includes/_config.php");
require("/includes/db.php");
if (isset($_GET['nom'])) {
$nom = $_GET['nom'];
 
$sq = "INSERT INTO texte(nom) VALUES('".mysql_real_escape_string($_GET['nom'])."')";
echo $sq;
 
}
magic quote à On affichage :
Citation:
INSERT INTO texte(nom) VALUES('\\\'sqdf\\\'qsdf')

magic quote à off affichage :
Citation:
INSERT INTO texte(nom) VALUES('\'sqdf\'qsdf')

Ca ne marche pas ton truc. C'est même assez catastrophique puisqu'il échappe le "'" et le "\", ce qui nous fait 3 \ pour 1 '
haltabush est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 30/03/2007, 09h44   #13
Membre habitué
 
Avatar de Alexandrebox
 
Inscription : août 2006
Messages : 613
Détails du profil
Informations forums :
Inscription : août 2006
Messages : 613
Points : 107
Points : 107
Oui Merci bcp Altabush
Alexandrebox est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 30/03/2007, 11h01   #14
Membre habitué
 
Avatar de Alexandrebox
 
Inscription : août 2006
Messages : 613
Détails du profil
Informations forums :
Inscription : août 2006
Messages : 613
Points : 107
Points : 107
Tu as mis des concaténations et des guillemets que je ne comprends pas. A mon avis, c'est ce qu'il faut faire. Corrige moi si je me trompe:

Code
Code :
1
2
3
4
5
6
7
8
9
10
11
 
require("/includes/_config.php");
require("/includes/db.php");
 
if (isset($_GET['nom'])) {
$nom = $_GET['nom'];
 
$sq = "INSERT INTO texte(nom) VALUES('mysql_real_escape_string($_GET['nom'])')";
echo $sq;
 
}
Alexandrebox est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 30/03/2007, 11h20   #15
Membre chevronné
 
Avatar de haltabush
 
Développeur Web
Inscription : avril 2005
Messages : 726
Détails du profil
Informations personnelles :
Âge : 27
Localisation : France

Informations professionnelles :
Activité : Développeur Web

Informations forums :
Inscription : avril 2005
Messages : 726
Points : 790
Points : 790
Test le tel quel, regarde ce que ça fait:
Citation:
Parse error: parse error, unexpected T_ENCAPSED_AND_WHITESPACE, expecting T_STRING or T_VARIABLE or T_NUM_STRING in C:\wamp\www\test.php on line 7
C'est normal, il y a 2 problèmes avec ta syntaxe.
1) mysql_real_escape_string est dans une chaine de caractère et ne sera donc pas interprété (enfin si, comme du texte donc bon)
2) $_GET[''] ne sera pas compris non plus, on ne peux insérer que des variable simples (!= tableau ou objets) dans des chaines avec ".
haltabush est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 30/03/2007, 11h29   #16
Membre à l'essai
 
Inscription : septembre 2004
Messages : 33
Détails du profil
Informations forums :
Inscription : septembre 2004
Messages : 33
Points : 24
Points : 24
bonjour,

Peut etre que ça peut aider j'utilise cette fonction que j'avais trouvée dans un très bon bouquin "site web marchand"

Elle permet de filter les données.

Code :
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
 
function filtre($valeur) {
	    if (phpversion() < "4.3.0") {
	      $valeur = addslashes($valeur);
	    }
	    else {
	      // --- stripslashes
		      if (get_magic_quotes_gpc()) {
		        $valeur = stripslashes($valeur);
		      }
		      // --- protection si ce n'est pas un entier
		      if (!is_numeric($valeur)) {
		        $valeur = mysql_real_escape_string($valeur);
		      }
	    }
	    return $valeur;
	}
Exemple de requete d'insertion:

Code :
1
2
 
 $sql = "INSERT.... Values (filtre($valeur)";
A revoir avec les nouvelles verions de php !
ademain est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 30/03/2007, 12h25   #17
Membre habitué
 
Avatar de Alexandrebox
 
Inscription : août 2006
Messages : 613
Détails du profil
Informations forums :
Inscription : août 2006
Messages : 613
Points : 107
Points : 107
Oui je vois ce que tu veux dire.
Dans ce cas, il faut traiter la variable avant son insertion de cette manière ci. D'ailleurs, c'est plus propre:

Code :
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
 
require("/includes/_config.php");
require("/includes/db.php");
 
if (isset($_GET['nom'])) {
  if (!is_numeric($nom)) {
  $nom = mysql_real_escape_string($nom)}
  else{
  $nom = $_GET['nom'];
  }
 
$sq = "INSERT INTO texte(nom) VALUES('$nom')";
echo $sq;
 
}
Alexandrebox est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 30/03/2007, 12h50   #18
Membre éclairé
 
Inscription : août 2006
Messages : 379
Détails du profil
Informations personnelles :
Âge : 24

Informations forums :
Inscription : août 2006
Messages : 379
Points : 383
Points : 383
Ademain => Il n'y a rien à revoir avec les futurs versions .

On écrit : si inférieur. Si ça augmente ça change pas. Mais addslashes ne doit plus être utiliser, il faut lui préférer mysql_escape_string() (ou _real).
SpiritOfDoc est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 30/03/2007, 13h13   #19
Membre chevronné
 
Avatar de haltabush
 
Développeur Web
Inscription : avril 2005
Messages : 726
Détails du profil
Informations personnelles :
Âge : 27
Localisation : France

Informations professionnelles :
Activité : Développeur Web

Informations forums :
Inscription : avril 2005
Messages : 726
Points : 790
Points : 790
Faut pas oublier le test sur les magic quotes, quand même.
haltabush est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 30/03/2007, 13h36   #20
Membre habitué
 
Avatar de Alexandrebox
 
Inscription : août 2006
Messages : 613
Détails du profil
Informations forums :
Inscription : août 2006
Messages : 613
Points : 107
Points : 107
Hatabush, il y a plus besoin des tests sur les magic quotes, puisqu'il y a déjà mysql_real_escape_string()
Alexandrebox 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 15h42.


 
 
 
 
Partenaires

Hébergement Web