IdentifiantMot de passe
Loading...
Mot de passe oublié ?Je m'inscris ! (gratuit)
Navigation

Inscrivez-vous gratuitement
pour pouvoir participer, suivre les réponses en temps réel, voter pour les messages, poser vos propres questions et recevoir la newsletter

Langage PHP Discussion :

[Sécurité] Récupérer une variable avec get_magic_quotes_gpc et addslashes


Sujet :

Langage PHP

  1. #1
    Membre habitué Avatar de Alexandrebox
    Profil pro
    Inscrit en
    Août 2006
    Messages
    635
    Détails du profil
    Informations personnelles :
    Localisation : Suisse

    Informations forums :
    Inscription : Août 2006
    Messages : 635
    Points : 153
    Points
    153
    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 : Sélectionner tout - Visualiser dans une fenêtre à part
    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 : Sélectionner tout - Visualiser dans une fenêtre à part
    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?

  2. #2
    Membre averti
    Profil pro
    Inscrit en
    Août 2006
    Messages
    379
    Détails du profil
    Informations personnelles :
    Âge : 36
    Localisation : France

    Informations forums :
    Inscription : Août 2006
    Messages : 379
    Points : 422
    Points
    422
    Par défaut
    Citation Envoyé par Alexandrebox
    Code de tout le monde
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    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.

  3. #3
    Membre habitué Avatar de Alexandrebox
    Profil pro
    Inscrit en
    Août 2006
    Messages
    635
    Détails du profil
    Informations personnelles :
    Localisation : Suisse

    Informations forums :
    Inscription : Août 2006
    Messages : 635
    Points : 153
    Points
    153
    Par défaut
    Merci beaucoup. Si j'ai bien compris, c'est ce que je dois faire:

    Premier cas Je ne suis pas sûr
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    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 : Sélectionner tout - Visualiser dans une fenêtre à part
    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'];
     
    }

  4. #4
    Membre éclairé Avatar de haltabush
    Profil pro
    Développeur Web
    Inscrit en
    Avril 2005
    Messages
    726
    Détails du profil
    Informations personnelles :
    Âge : 39
    Localisation : France

    Informations professionnelles :
    Activité : Développeur Web

    Informations forums :
    Inscription : Avril 2005
    Messages : 726
    Points : 835
    Points
    835
    Par défaut
    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 : Sélectionner tout - Visualiser dans une fenêtre à part
     $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.

  5. #5
    Membre habitué Avatar de Alexandrebox
    Profil pro
    Inscrit en
    Août 2006
    Messages
    635
    Détails du profil
    Informations personnelles :
    Localisation : Suisse

    Informations forums :
    Inscription : Août 2006
    Messages : 635
    Points : 153
    Points
    153
    Par défaut
    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 : Sélectionner tout - Visualiser dans une fenêtre à part
    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 : Sélectionner tout - Visualiser dans une fenêtre à part
    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?

  6. #6
    Membre éclairé Avatar de haltabush
    Profil pro
    Développeur Web
    Inscrit en
    Avril 2005
    Messages
    726
    Détails du profil
    Informations personnelles :
    Âge : 39
    Localisation : France

    Informations professionnelles :
    Activité : Développeur Web

    Informations forums :
    Inscription : Avril 2005
    Messages : 726
    Points : 835
    Points
    835
    Par défaut
    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é)

  7. #7
    Membre habitué Avatar de Alexandrebox
    Profil pro
    Inscrit en
    Août 2006
    Messages
    635
    Détails du profil
    Informations personnelles :
    Localisation : Suisse

    Informations forums :
    Inscription : Août 2006
    Messages : 635
    Points : 153
    Points
    153
    Par défaut
    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 : Sélectionner tout - Visualiser dans une fenêtre à part
    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

  8. #8
    Membre éclairé Avatar de haltabush
    Profil pro
    Développeur Web
    Inscrit en
    Avril 2005
    Messages
    726
    Détails du profil
    Informations personnelles :
    Âge : 39
    Localisation : France

    Informations professionnelles :
    Activité : Développeur Web

    Informations forums :
    Inscription : Avril 2005
    Messages : 726
    Points : 835
    Points
    835
    Par défaut
    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

  9. #9
    Membre averti
    Profil pro
    Inscrit en
    Août 2006
    Messages
    379
    Détails du profil
    Informations personnelles :
    Âge : 36
    Localisation : France

    Informations forums :
    Inscription : Août 2006
    Messages : 379
    Points : 422
    Points
    422
    Par défaut
    Tu peux aussi le mettre à off (0).

  10. #10
    Membre habitué Avatar de Alexandrebox
    Profil pro
    Inscrit en
    Août 2006
    Messages
    635
    Détails du profil
    Informations personnelles :
    Localisation : Suisse

    Informations forums :
    Inscription : Août 2006
    Messages : 635
    Points : 153
    Points
    153
    Par défaut
    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 : Sélectionner tout - Visualiser dans une fenêtre à part
    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());
     
    }

  11. #11
    Membre averti
    Profil pro
    Inscrit en
    Août 2006
    Messages
    379
    Détails du profil
    Informations personnelles :
    Âge : 36
    Localisation : France

    Informations forums :
    Inscription : Août 2006
    Messages : 379
    Points : 422
    Points
    422
    Par défaut
    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

  12. #12
    Membre éclairé Avatar de haltabush
    Profil pro
    Développeur Web
    Inscrit en
    Avril 2005
    Messages
    726
    Détails du profil
    Informations personnelles :
    Âge : 39
    Localisation : France

    Informations professionnelles :
    Activité : Développeur Web

    Informations forums :
    Inscription : Avril 2005
    Messages : 726
    Points : 835
    Points
    835
    Par défaut
    Je test.

    edit:
    test.php?nom='sqdf'qsdf
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    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 :
    INSERT INTO texte(nom) VALUES('\\\'sqdf\\\'qsdf')

    magic quote à off affichage :
    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 '

  13. #13
    Membre habitué Avatar de Alexandrebox
    Profil pro
    Inscrit en
    Août 2006
    Messages
    635
    Détails du profil
    Informations personnelles :
    Localisation : Suisse

    Informations forums :
    Inscription : Août 2006
    Messages : 635
    Points : 153
    Points
    153
    Par défaut
    Oui Merci bcp Altabush

  14. #14
    Membre habitué Avatar de Alexandrebox
    Profil pro
    Inscrit en
    Août 2006
    Messages
    635
    Détails du profil
    Informations personnelles :
    Localisation : Suisse

    Informations forums :
    Inscription : Août 2006
    Messages : 635
    Points : 153
    Points
    153
    Par défaut
    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 : Sélectionner tout - Visualiser dans une fenêtre à part
    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;
     
    }

  15. #15
    Membre éclairé Avatar de haltabush
    Profil pro
    Développeur Web
    Inscrit en
    Avril 2005
    Messages
    726
    Détails du profil
    Informations personnelles :
    Âge : 39
    Localisation : France

    Informations professionnelles :
    Activité : Développeur Web

    Informations forums :
    Inscription : Avril 2005
    Messages : 726
    Points : 835
    Points
    835
    Par défaut
    Test le tel quel, regarde ce que ça fait:
    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 ".

  16. #16
    Nouveau membre du Club
    Profil pro
    Inscrit en
    Septembre 2004
    Messages
    33
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Septembre 2004
    Messages : 33
    Points : 35
    Points
    35
    Par défaut
    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 : Sélectionner tout - Visualiser dans une fenêtre à part
    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 : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
     
     $sql = "INSERT.... Values (filtre($valeur)";
    A revoir avec les nouvelles verions de php !

  17. #17
    Membre habitué Avatar de Alexandrebox
    Profil pro
    Inscrit en
    Août 2006
    Messages
    635
    Détails du profil
    Informations personnelles :
    Localisation : Suisse

    Informations forums :
    Inscription : Août 2006
    Messages : 635
    Points : 153
    Points
    153
    Par défaut
    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 : Sélectionner tout - Visualiser dans une fenêtre à part
    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;
     
    }

  18. #18
    Membre averti
    Profil pro
    Inscrit en
    Août 2006
    Messages
    379
    Détails du profil
    Informations personnelles :
    Âge : 36
    Localisation : France

    Informations forums :
    Inscription : Août 2006
    Messages : 379
    Points : 422
    Points
    422
    Par défaut
    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).

  19. #19
    Membre éclairé Avatar de haltabush
    Profil pro
    Développeur Web
    Inscrit en
    Avril 2005
    Messages
    726
    Détails du profil
    Informations personnelles :
    Âge : 39
    Localisation : France

    Informations professionnelles :
    Activité : Développeur Web

    Informations forums :
    Inscription : Avril 2005
    Messages : 726
    Points : 835
    Points
    835
    Par défaut
    Faut pas oublier le test sur les magic quotes, quand même.

  20. #20
    Membre habitué Avatar de Alexandrebox
    Profil pro
    Inscrit en
    Août 2006
    Messages
    635
    Détails du profil
    Informations personnelles :
    Localisation : Suisse

    Informations forums :
    Inscription : Août 2006
    Messages : 635
    Points : 153
    Points
    153
    Par défaut
    Hatabush, il y a plus besoin des tests sur les magic quotes, puisqu'il y a déjà mysql_real_escape_string()

Discussions similaires

  1. Récupèrer une variable avec une lettre au bout.
    Par arthuro45 dans le forum Général JavaScript
    Réponses: 7
    Dernier message: 08/01/2011, 12h52
  2. Récupérer une variable avec $_GET
    Par boubz013 dans le forum Langage
    Réponses: 7
    Dernier message: 30/12/2010, 19h59
  3. récupérer une variable avec $_POST
    Par Giantrick dans le forum Langage
    Réponses: 3
    Dernier message: 11/05/2009, 00h03
  4. Récupérer une variable avec la fonction $.ajax
    Par freakss dans le forum jQuery
    Réponses: 14
    Dernier message: 23/02/2009, 15h16
  5. [Système] Récupérer une variable avec Curl
    Par Alexdezark dans le forum Langage
    Réponses: 2
    Dernier message: 26/11/2007, 15h33

Partager

Partager
  • Envoyer la discussion sur Viadeo
  • Envoyer la discussion sur Twitter
  • Envoyer la discussion sur Google
  • Envoyer la discussion sur Facebook
  • Envoyer la discussion sur Digg
  • Envoyer la discussion sur Delicious
  • Envoyer la discussion sur MySpace
  • Envoyer la discussion sur Yahoo