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 :

se protéger contre les injections sql


Sujet :

PHP & Base de données

  1. #1
    Membre du Club
    Profil pro
    Inscrit en
    Septembre 2009
    Messages
    188
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Septembre 2009
    Messages : 188
    Points : 55
    Points
    55
    Par défaut se protéger contre les injections sql
    bonjour a tous,ou bonsoir


    je suis actuellement entrin d'essayer de protéger mon site contre les injections sql mai le souci c'est qu'a part addslashs,stripslash et mysql_query_string je ne connai rien d'autre donc je pense savoir proteger mes champs dan un formulaire par contre proterger des injection au niveau de la bare url
    (http://ma_page?id=xx&&id=xx...) j'en ai aucune idee si quelqu'un pouvai juste me dir comment on fai sa serai cool merci d'avance

  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
    Points : 44 155
    Points
    44 155
    Par défaut
    tu n'as besoin ni de addslashes() ni de stripslashes() a moins que ton serveur t'impose les magic_quotes_gpc.

    tu dois par contre effectivement utiliser mysql_real_escape_string() sur les données que tu places dans tes requetes, c'est la meme chose que les données viennent d'une url ou d'un formulaire.
    N'oubliez pas de consulter les FAQ PHP et les cours et tutoriels PHP

  3. #3
    Membre du Club
    Profil pro
    Inscrit en
    Septembre 2009
    Messages
    188
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Septembre 2009
    Messages : 188
    Points : 55
    Points
    55
    Par défaut
    merci sabotage pour ta réponse mais regarde comme pour cette variable que je veux securiser comment je dois faire?

    parce que quand je fais :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    $c=mysql_real_escape_string($_GET['c']);
    j'ai une erreur mais quand je laisse la variable sans mysql_real_escape... ça marche bien mais le souci c'est que des que je met une apostrophe dans la barre url j'ai un message d'erreur sql ce qui signifie protection 0

    je ne sais pas si tu comprends ce que je veux dire : en gros mon probleme c'est l'erreur que j'ai quand je met une apostrophe dans l'url

  4. #4
    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
    Points : 44 155
    Points
    44 155
    Par défaut
    Et quelle est l'erreur que tu rencontres ?
    N'oubliez pas de consulter les FAQ PHP et les cours et tutoriels PHP

  5. #5
    Membre du Club
    Profil pro
    Inscrit en
    Septembre 2009
    Messages
    188
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Septembre 2009
    Messages : 188
    Points : 55
    Points
    55
    Par défaut
    voila l'erreur que j'ai des que je met une apostrophe dans l'url :

    You have an error in your SQL syntax; check the manual that corresponds to your MySQL server version for the right syntax to use near ''Bienvenue'' AND id_categori1=id_cat1_f GROUP BY titre_cat1,nom_fo' at line 5
    comment je pourai eviter sa stp

  6. #6
    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
    Points : 44 155
    Points
    44 155
    Par défaut
    Visiblement ton apostrophe n'est pas echappé ici.
    Pourrait-on voit le code qui fait ta requete ?
    N'oubliez pas de consulter les FAQ PHP et les cours et tutoriels PHP

  7. #7
    Membre du Club
    Profil pro
    Inscrit en
    Septembre 2009
    Messages
    188
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Septembre 2009
    Messages : 188
    Points : 55
    Points
    55
    Par défaut
    biensur sabotage le voici

    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
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    $c=$_GET['c'];
     
     
    if(!isset($c)){
     
    $sql_f=mysql_query("select nom_forum,id_forum,im_for,titre_sujet,descri_cat,id_sujet,date_sujet,auteur_sujet,id_suj_forum,message,titre_cat1,id_categori1,satmp_cat,date_message,auteur_message
    ,COUNT(titre_sujet) AS nb_s ,COUNT(message) AS nb_m FROM categorie1 
    LEFT JOIN forum ON (id_cat1_f=id_categori1)
    LEFT JOIN sujet_forum ON (id_sujet=id_suj_forum) 
    LEFT JOIN message_topic ON (id_mes_suj=id_sujet)
    GROUP BY titre_cat1,nom_forum,titre_sujet ORDER BY satmp_cat ASC ") or die (mysql_error());
    }
     
    else{
     
    $sql_f=mysql_query("select nom_forum,id_forum,im_for,titre_sujet,descri_cat,id_sujet,date_sujet,auteur_sujet,id_suj_forum,message,titre_cat1,id_categori1,satmp_cat,date_message,auteur_message
    ,COUNT(titre_sujet) AS nb_s  ,COUNT(message) AS nb_m FROM categorie1 
    LEFT JOIN forum ON (id_cat1_f=id_categori1)
    LEFT JOIN sujet_forum ON (id_sujet=id_suj_forum) 
    LEFT JOIN message_topic ON (id_mes_suj=id_sujet) WHERE titre_cat1='".mysql_real_escape_string($c)."'AND id_categori1=id_cat1_f
    GROUP BY titre_cat1,nom_forum,titre_sujet ORDER BY satmp_cat ASC  ")or die (mysql_error());
     
    $get="<img src=\"images/lastpost.gif\"width=\"10\" height=\"7\"border=\"0\"/><a href=\"forum.php?c=".mysql_real_escape_string($c)."\">&nbsp;<font color=\"#66F\">".mysql_real_escape_string($c)."</a>";
    }
     
    //recolte des donnees
    while($row= mysql_fetch_array($sql_f)) {
    $categorie = $row['titre_cat1'];
    $tableau[$categorie][] = $row;
    }

  8. #8
    Rédacteur
    Avatar de RideKick
    Homme Profil pro
    Directeur technique
    Inscrit en
    Septembre 2006
    Messages
    5 914
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Rhône (Rhône Alpes)

    Informations professionnelles :
    Activité : Directeur technique
    Secteur : High Tech - Produits et services télécom et Internet

    Informations forums :
    Inscription : Septembre 2006
    Messages : 5 914
    Points : 12 572
    Points
    12 572
    Par défaut
    Il faut bien aussi se dire une chose importante :

    NE jamais faire confiance au visiteur

    Ce qui consiste a dire : toujours verifier les données et leur type avant de les balancer dans une requete.

    ça evite deja pas mal d'erreur.
    Pas de questions techniques en MP please

    Mon site perso

    Mon profil Viadeo

  9. #9
    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
    Points : 44 155
    Points
    44 155
    Par défaut
    Il manque un espace avant le AND

    Egalement il y a un problème de logique : tu ne peux pas commencer par utiliser $_GET['c'] et ensuite t'interesser à savoir s'il existait ou non.
    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
    18
    19
    20
    21
    if(!isset($_GET['c'])){
     
    $sql_f=mysql_query("select nom_forum,id_forum,im_for,titre_sujet,descri_cat,id_sujet,date_sujet,auteur_sujet,id_suj_forum,message,titre_cat1,id_categori1,satmp_cat,date_message,auteur_message
    ,COUNT(titre_sujet) AS nb_s ,COUNT(message) AS nb_m FROM categorie1 
    LEFT JOIN forum ON (id_cat1_f=id_categori1)
    LEFT JOIN sujet_forum ON (id_sujet=id_suj_forum) 
    LEFT JOIN message_topic ON (id_mes_suj=id_sujet)
    GROUP BY titre_cat1,nom_forum,titre_sujet ORDER BY satmp_cat ASC ") or die (mysql_error());
    }
     
    else{
     
    $sql_f=mysql_query("select nom_forum,id_forum,im_for,titre_sujet,descri_cat,id_sujet,date_sujet,auteur_sujet,id_suj_forum,message,titre_cat1,id_categori1,satmp_cat,date_message,auteur_message
    ,COUNT(titre_sujet) AS nb_s  ,COUNT(message) AS nb_m FROM categorie1 
    LEFT JOIN forum ON (id_cat1_f=id_categori1)
    LEFT JOIN sujet_forum ON (id_sujet=id_suj_forum) 
    LEFT JOIN message_topic ON (id_mes_suj=id_sujet) WHERE titre_cat1='".mysql_real_escape_string($_GET['c'])."' AND id_categori1=id_cat1_f
    GROUP BY titre_cat1,nom_forum,titre_sujet ORDER BY satmp_cat ASC  ")or die (mysql_error());
     
    $get="<img src=\"images/lastpost.gif\"width=\"10\" height=\"7\"border=\"0\"/><a href=\"forum.php?c=".urlencode($_GET['c'])."\">&nbsp;<font color=\"#66F\">".htmlentities($_GET['c'])."</a>";
    }
    Egalement : quand on passe une donnée dans une url, on utilise urlencode().
    Quand on doit afficher une donnée tierce, on utilise htmlentities().
    N'oubliez pas de consulter les FAQ PHP et les cours et tutoriels PHP

  10. #10
    Membre du Club
    Profil pro
    Inscrit en
    Septembre 2009
    Messages
    188
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Septembre 2009
    Messages : 188
    Points : 55
    Points
    55
    Par défaut
    merci sabotage mai j'ai un nouveaux message d'erreur qui est :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
     
    Warning: Invalid argument supplied for foreach() in D:\wamp\www\dossier\forum.php on line 369

  11. #11
    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
    Points : 44 155
    Points
    44 155
    Par défaut
    Je ne peux pas deviner ce qu'il y a dans ton code à la ligne 369
    N'oubliez pas de consulter les FAQ PHP et les cours et tutoriels PHP

  12. #12
    Membre du Club
    Profil pro
    Inscrit en
    Septembre 2009
    Messages
    188
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Septembre 2009
    Messages : 188
    Points : 55
    Points
    55
    Par défaut
    excuse moi que sabotage

    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
    18
    19
    20
    21
    ligne 349----><?php foreach($tableau as $nom=>$valeurs) {?>
              <table width="100%" border="0" cellpadding="0" cellspacing="0" class="fon_2">
                <tr>
                  <td width="54%" height="23" align="left" valign="middle" class="ecriture_principal"><b><img src="images/open.gif.png" alt="" width="14" height="11" /> <a href="forum.php?c=<?php echo $nom; ?>"><?php echo $nom; ?></a></b></td>
                  <td width="46%" height="23" align="left" valign="top" class="ecriture_principal2"><span class="fond_3_suite"><span class="fond_3"><img src="images/cellpic2.jpg" width="100%" height="23" /></span></span></td>
                </tr>
              </table>
              <?php foreach($valeurs as $sous_categorie) { ?>
              <table width="100%" height="43" border="0" cellpadding="0" cellspacing="0" class="bordur2">
                <tr>
                  <td width="3%" height="41" align="center" valign="middle" bgcolor="#E6EAED" class="ecrit_noir"><img src="images/nouvo.png" width="20" height="20" /></td>
                  <td width="64%" bgcolor="#F3F3F3" class="truc"><span class="titre_forum">&nbsp;<?php echo "<img src=\"images/".$sous_categorie['im_for']."\" width=\"15\" height=\"15\" />"; ?> <?php echo $sous_categorie['nom_forum']; ?></span><br />
                    <span class="petite_ecriture">&nbsp;&nbsp;<?php echo $sous_categorie['descri_cat']; ?></span></td>
                  <td width="6%" align="center" valign="middle" bgcolor="#DCE1E5" class="ecrit_noir"><?php echo $sous_categorie['nb_s']; ?></td>
                  <td width="6%" align="center" valign="middle" bgcolor="#E6EAED" class="ecrit_noir"><?php echo $sous_categorie['nb_m']; ?></td>
                  <td width="21%" align="center" valign="middle" bgcolor="#F3F3F3" class="petite_ecriture"> a <br />
                    <img src="images/dernier_mes.gif" width="18" height="9" /></td>
                </tr>
              </table>
              <?php }
    ligne 369-----> }?>

  13. #13
    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
    Points : 44 155
    Points
    44 155
    Par défaut
    Controle que ta requete retourne bien des lignes et que $tableau vaut quelque chose.
    Dans tous les cas tu peux ajouter un
    avant ta requete, ca ne solutionnera pas le problème mais ca gérera ce cas.
    N'oubliez pas de consulter les FAQ PHP et les cours et tutoriels PHP

  14. #14
    Membre du Club
    Profil pro
    Inscrit en
    Septembre 2009
    Messages
    188
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Septembre 2009
    Messages : 188
    Points : 55
    Points
    55
    Par défaut
    je compren rien je commence a me perdre mai normalement oui mon tableau retourne bien des valeur puisque si je ne met pas cette satané apostrophe dans la barre url sa marche super

    c'est juste quand je met une apostrophe dans la barre de navigation que les probleme commence

  15. #15
    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
    Points : 44 155
    Points
    44 155
    Par défaut
    normalement oui mon tableau
    Ce n'est pas "normalement" qui nous interesse.
    C'est precisemment, ta requete, avec la valeur avec l'apostrophe dedans, est-ce qu'elle retourne des lignes ?
    Teste la dans phpmyadmin par exemple.
    N'oubliez pas de consulter les FAQ PHP et les cours et tutoriels PHP

  16. #16
    Membre du Club
    Profil pro
    Inscrit en
    Septembre 2009
    Messages
    188
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Septembre 2009
    Messages : 188
    Points : 55
    Points
    55
    Par défaut
    comme tu m'a dit j'ai tester dan phpmyadmin et sa me donne sa :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    Erreur
     
    Il semble qu'il y ait une erreur dans votre requête SQL. Le message ci-bas peut vous aider à en trouver la cause.
     
    ERROR: Apostrophe non fermé @ 403
    STR: '

  17. #17
    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
    Points : 44 155
    Points
    44 155
    Par défaut
    Et quelle requete executes-tu ?
    N'oubliez pas de consulter les FAQ PHP et les cours et tutoriels PHP

  18. #18
    Membre du Club
    Profil pro
    Inscrit en
    Septembre 2009
    Messages
    188
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Septembre 2009
    Messages : 188
    Points : 55
    Points
    55
    Par défaut
    voila la requette que j'execute dans phpmyadmin :

    j'ai remplacer la variable qui corespond au parametre url a sa valeur c'est a dir
    "L'actualité"

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    select nom_forum,id_forum,im_for,titre_sujet,descri_cat,id_sujet,date_sujet,auteur_sujet,id_suj_forum,message,titre_cat1,id_categori1,satmp_cat,date_message,auteur_message
    ,COUNT(titre_sujet) AS nb_s  ,COUNT(message) AS nb_m FROM categorie1 
    LEFT JOIN forum ON (id_cat1_f=id_categori1)
    LEFT JOIN sujet_forum ON (id_sujet=id_suj_forum) 
    LEFT JOIN message_topic ON (id_mes_suj=id_sujet) WHERE titre_cat1= l'actialité AND id_categori1=id_cat1_f
    GROUP BY titre_cat1,nom_forum,titre_sujet ORDER BY satmp_cat ASC

    mais dans mon script je crois que c'est pas une erreur sql mai plutot une erreur php pasque l'erreur c'est sa :Warning: Invalid argument supplied for foreach() in D:\wamp\www\dossier\forum.php on line 294

    qui a un raport avec la boucle foreach

  19. #19
    Membre éprouvé Avatar de FCYPBA
    Profil pro
    Inscrit en
    Novembre 2004
    Messages
    745
    Détails du profil
    Informations personnelles :
    Âge : 45
    Localisation : France, Paris (Île de France)

    Informations forums :
    Inscription : Novembre 2004
    Messages : 745
    Points : 952
    Points
    952
    Par défaut
    L'erreur Php que tu rencontres te signale juste que tu essaie de faire un foreach sur une variable qui n'est pas itérable ( un tableau en gros )

    Pourquoi ce n'est pas un tableau, tout simplement car ta requête ne fonctionne pas ou ne renvoie aucune ligne.

    En gros, je modifierai le script de la façon suivante

    Visiblement pas d'erreur car sinon tu irais dans le die(), mais tu peux faire un log de la requête au cas où( écran, ou fichier )
    Ensuite, il faut initialiser la variable $tableau pour éviter le warning sur le foreach
    Pierre
    1. Dans le manuel ( PHP, MySQL,..., rayez la mention inutile), tu te plongeras à deux fois plutôt qu'aucune.
    2. Dans la doc php, tu liras attentivement les sections Chaines de caractères, Tableaux et Système de fichiers
    3. Un code rapide c'est bien, un code maintenable c'est mieux
    ...

    Why was the font tag an orphan ? Because it didn't have a font-family.

  20. #20
    Membre du Club
    Profil pro
    Inscrit en
    Septembre 2009
    Messages
    188
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Septembre 2009
    Messages : 188
    Points : 55
    Points
    55
    Par défaut
    merci pour ta reponse FCYPBA

    mai la je suis perdu je compren plus rien avec ce foreach commen je doi faire deja pour que j'ai deux valeur differente dan cette boucle foreach?

    sa commence a devenir trop compliquer tou sa

Discussions similaires

  1. protection contre les injections SQL
    Par Merling dans le forum Applications
    Réponses: 1
    Dernier message: 23/02/2010, 09h28
  2. Sécurité contre les injections SQL
    Par Generation-Web dans le forum Langage
    Réponses: 2
    Dernier message: 27/11/2008, 14h17
  3. Prévention contre les injections SQL
    Par Community Management dans le forum ASP
    Réponses: 0
    Dernier message: 29/07/2008, 12h50
  4. Lutter contre les injections SQL
    Par EvilAngel dans le forum ASP
    Réponses: 4
    Dernier message: 15/06/2006, 17h27

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