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

PHP & Base de données Discussion :

Sécurité avant de faire un INSERT


Sujet :

PHP & Base de données

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre confirmé
    Profil pro
    Développeur Web
    Inscrit en
    Août 2003
    Messages
    111
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations professionnelles :
    Activité : Développeur Web

    Informations forums :
    Inscription : Août 2003
    Messages : 111
    Par défaut Sécurité avant de faire un INSERT
    J'ai un formulaire dont je veux ecrire les résultat dans ma base. Jusque là rien d'extrordinaire me direz vous...

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    $sql = "INSERT INTO commandes(date_command,tarif,date_depart,heure_depart,adresse_depart,ville_depart,adresse_arrivee,ville_arrivee,nb_personne,commentaire) VALUES('$date_command','$prix_valid','$date_valid','$heure_valid','$adresse_depart','$ville_depart','$adresse_arrivee',
    '$ville_arrivee','$nb_valid','$commentaire')";
     
     
        // on insère les informations du formulaire dans la table
        mysql_query($sql) or die('Erreur SQL !'.$sql.'<br>'.mysql_error());
    Le problème c'est que je ne veux pas qu'on puisse y rentrer n'importe quoi (code, injection SQL, ou simplement une apostrophe simple...).

    Mes recherches dans mon bouquin et sur le net sont assez contradictoires.

    Chacun y va de son conseil qui démonte celui de l'autre.

    Donc selon vous, quels serait la meilleur façon, aujourd'hui de securiser mon code ?

  2. #2
    Modérateur
    Avatar de sabotage
    Homme Profil pro
    Inscrit en
    Juillet 2005
    Messages
    29 208
    Détails du profil
    Informations personnelles :
    Sexe : Homme

    Informations forums :
    Inscription : Juillet 2005
    Messages : 29 208
    Par défaut
    J'aimerais bien savoir ce que tu as pu trouver comme information contradictoires.

    Il est recommandé d'utiliser PDO ou myslqi et des requêtes préparées.
    N'oubliez pas de consulter les FAQ PHP et les cours et tutoriels PHP

  3. #3
    Expert confirmé

    Homme Profil pro
    Développeur Web
    Inscrit en
    Septembre 2010
    Messages
    5 418
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Puy de Dôme (Auvergne)

    Informations professionnelles :
    Activité : Développeur Web
    Secteur : High Tech - Multimédia et Internet

    Informations forums :
    Inscription : Septembre 2010
    Messages : 5 418
    Par défaut
    Comme sabotage, je n'ai pas lu non plus d'informations contradictoires... ?

    Avec ton code actuel tu devrais utiliser "mysql_real_escape_string" sur chacune de tes variables. L'information sur les injection se trouve justement dans la doc de la fonction.

    En bref il faut toujours protéger ses variables (ici dans la clause "values"). Pour les requêtes non préparées on utilise les fonctions "mysql_real_escape_string" avec mysql, "mysqli_real_escape_string" avec mysqli, et la fonction "quote" avec pdo.

    Avec mysqli ou pdo, une autre façon de protéger encore plus efficacement les variables est d'utiliser les requêtes préparées. Dans ce cas on utilise aucune des fonctions précédemment citées car c'est le processus de la préparation (abstraction) qui fait office de protection.

    Dans ton cas, étant donné que tu n'utilise pas de requête préparée (mysql ne les supporte pas nativement), et que tu n'utilise pour l'instant aucune fonction pour protéger tes variables, ta requête en l'état n'est pas sécurisée.

    Pour le reste tu peux constater qu'on déconseille d'utiliser l'extension mysql pour les nouveaux projets. Il vaut donc mieux choisir mysqli ou pdo.

  4. #4
    Membre confirmé
    Homme Profil pro
    Webmaster
    Inscrit en
    Janvier 2006
    Messages
    132
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Côte d'Ivoire

    Informations professionnelles :
    Activité : Webmaster
    Secteur : High Tech - Multimédia et Internet

    Informations forums :
    Inscription : Janvier 2006
    Messages : 132
    Par défaut
    Tu peux aussi utiliser le pour protéger tes variables.
    Si tu as une version PHP 5.5.0 alors la fonction "mysqli_real_escape_string" ne te servira pas à grande chose car obsolète.
    La solution idéale comme l'a écrit Sabotage et ABCIWEB c'est de passer à PDO ou Mysqli.

  5. #5
    Expert confirmé Avatar de papajoker
    Homme Profil pro
    Développeur Web
    Inscrit en
    Septembre 2013
    Messages
    2 323
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Nièvre (Bourgogne)

    Informations professionnelles :
    Activité : Développeur Web
    Secteur : High Tech - Multimédia et Internet

    Informations forums :
    Inscription : Septembre 2013
    Messages : 2 323
    Par défaut
    Citation Envoyé par moudjahidine Voir le message
    Tu peux aussi utiliser htmlentities pour protéger tes variables.
    htmlentities() ne doit pas être utiliser pour une protection contre l'injection, donc on ne l'utilise pas sur des données à insérer dans une table.
    Par contre il peut-être utilisé pour une protection XSS, donc pour un affichage après avoir récupéré les données de la table.

    mysqli_real_escape_string n'est pas obsolète.
    mysql_real_escape_string est obsolète, ce qui signifie qu'il fonctionne encore ! mais dans le futur

  6. #6
    Expert confirmé

    Homme Profil pro
    Développeur Web
    Inscrit en
    Septembre 2010
    Messages
    5 418
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Puy de Dôme (Auvergne)

    Informations professionnelles :
    Activité : Développeur Web
    Secteur : High Tech - Multimédia et Internet

    Informations forums :
    Inscription : Septembre 2010
    Messages : 5 418
    Par défaut
    +1 pour confirmer qu'on utilise pas htmlentities pour protéger des variables lors de l'insertion dans une bdd. En faisant ainsi on rend impropre l'exportation des données sans traitement préalable, on rend impossible la recherche insensible aux caractères accentués, et on encombre la table avec des caractères inutiles.

    htmlentities ne doit être utilisé que lors de l'affichage, typiquement dans un echo.

Discussions similaires

  1. Comment faire des inserts massivement et rapidement ?
    Par JYves dans le forum Langage SQL
    Réponses: 6
    Dernier message: 09/08/2006, 10h57
  2. Comment faire des inserts massivement et rapidement ?
    Par JYves dans le forum Décisions SGBD
    Réponses: 5
    Dernier message: 09/08/2006, 10h57
  3. Comment faire une insertion dans un fichier texte ?
    Par Isa31 dans le forum Langage
    Réponses: 10
    Dernier message: 28/12/2004, 09h06
  4. [C#] Faire un INSERT en même temps dans 2 bases differentes
    Par Pingva dans le forum Accès aux données
    Réponses: 8
    Dernier message: 09/09/2004, 12h07
  5. faire un insert pour un champ blob
    Par tripper.dim dans le forum InterBase
    Réponses: 10
    Dernier message: 02/05/2003, 16h56

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