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

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre éclairé 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
    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 chevronné
    Profil pro
    Inscrit en
    Août 2006
    Messages
    379
    Détails du profil
    Informations personnelles :
    Âge : 37
    Localisation : France

    Informations forums :
    Inscription : Août 2006
    Messages : 379
    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 éclairé 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
    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 émérite Avatar de haltabush
    Profil pro
    Développeur Web
    Inscrit en
    Avril 2005
    Messages
    726
    Détails du profil
    Informations personnelles :
    Âge : 40
    Localisation : France

    Informations professionnelles :
    Activité : Développeur Web

    Informations forums :
    Inscription : Avril 2005
    Messages : 726
    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 éclairé 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
    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 émérite Avatar de haltabush
    Profil pro
    Développeur Web
    Inscrit en
    Avril 2005
    Messages
    726
    Détails du profil
    Informations personnelles :
    Âge : 40
    Localisation : France

    Informations professionnelles :
    Activité : Développeur Web

    Informations forums :
    Inscription : Avril 2005
    Messages : 726
    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 éclairé 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
    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

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