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

SQL Procédural MySQL Discussion :

mysql_real_escape_string() et un tableau : problème


Sujet :

SQL Procédural MySQL

  1. #1
    Inscrit
    Profil pro
    Inscrit en
    Juin 2006
    Messages
    531
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juin 2006
    Messages : 531
    Points : 282
    Points
    282
    Par défaut mysql_real_escape_string() et un tableau : problème
    Bonjour,

    J'ai un problème avec l'utilisation de mysql_real_escape_string sur un tableau expédié via $_POST[].

    C'est simple, j'ai plusieurs checkbox :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    <input type="checkbox" name="supprimer[]" value="'.$R[id].'">
    Quand le formulaire est envoyé, à réception, je cherche à le filtrer avant d'utiliser son contenu dans une requête sql (question de sécurité, bien sûr).

    Donc je fais ça :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
     
    $_POST['supprimer']=
    htmlentities(mysql_real_escape_string($_POST['supprimer']));
    La requête sql, c'est ça :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
     
    SELECT
     id
     FROM 
    messagerieRecu 
    WHERE
     id 
    IN (".implode(',', $_POST["supprimer"]).")
    Donc la requête fonctionne bien si je supprime le filtre par mysql_real_escape_string, mais si je le laisse j'obtiens les erreurs :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
     
    Warning: mysql_real_escape_string() expects parameter 1 to be string, array given in /home.2/site/www/messages-recus.php on line 35
     
    Warning: implode(): Bad arguments. in /home.2/site/www/messages-recus.php on line 36
     
    Warning: mysql_fetch_array(): supplied argument is not a valid MySQL result resource in /home.2/site/www/messages-recus.php on line 39
     
    Warning: mysql_free_result(): supplied argument is not a valid MySQL result resource in /home.2/site/www/messages-recus.php on line 44
    Le problème bien sûr c'est que je dois filtrer ma variable $_POST[supprimer] avant de l'utiliser dans la requête.

    Alors comment puis-je faire ici svp ?

  2. #2
    Rédacteur

    Homme Profil pro
    Développeur Web
    Inscrit en
    Juillet 2003
    Messages
    695
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 42
    Localisation : France, Gironde (Aquitaine)

    Informations professionnelles :
    Activité : Développeur Web

    Informations forums :
    Inscription : Juillet 2003
    Messages : 695
    Points : 1 071
    Points
    1 071
    Par défaut
    arning: mysql_real_escape_string() expects parameter 1 to be string, array given in /home.2/site/www/messages-recus.php on line 35

    Warning: implode(): Bad arguments. in /home.2/site/www/messages-recus.php on line 36
    il te dit que c'est un tableau, donc agit sur chaque élément du tableau. Soit avec une boucle, ou mieux, avec array_map ou array_filter
    par exemple

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
     $tab = array_map('mysql_real_escape_string', $_POST['supprimer']);
    Articles sur developpez.com
    - Gestion des exceptions avec PHP5
    - Chiffrement et hash en PHP contre l'attaque Man in the middle
    - Aedituus - Espace membre sécurisé en PHP5

  3. #3
    Inscrit
    Profil pro
    Inscrit en
    Juin 2006
    Messages
    531
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juin 2006
    Messages : 531
    Points : 282
    Points
    282
    Par défaut
    Oui je mettais dis, qu'il fallait utiliser une boucle.

    Que penses-tu de ça, Wamania :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    <?php 
    $supprimer = array(); 
    foreach( $_POST['supprimer'] as $valeur ) { 
      $supprimer[] = htmlspecialchars( mysql_real_escape_string( $valeur ) ); 
    } 
    ?>
    Ou alors :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    <?php 
    $supprimer = array_map( 'mysql_real_escape_string', $_POST['supprimer'] ); 
    $supprimer = array_map( 'htmlspecialchars', $supprimer ); 
    ?>
    Ce qui m'étonne ici, c'est que $supprimer puisse contenir tout un tableau sans qu'il n'y ai de précisé les signes [].
    Et d'ailleurs, ces deux possibilités sont-elles bonnes ? (sachant que le contenu de $_POST['supprimer'] est une suite d'entier numérique.

  4. #4
    Rédacteur

    Homme Profil pro
    Développeur Web
    Inscrit en
    Juillet 2003
    Messages
    695
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 42
    Localisation : France, Gironde (Aquitaine)

    Informations professionnelles :
    Activité : Développeur Web

    Informations forums :
    Inscription : Juillet 2003
    Messages : 695
    Points : 1 071
    Points
    1 071
    Par défaut
    Les deux sont bons.

    Array_map renvoie déjà un tableau, c'est pour ça qu'on n'a pas besoin des []

    si tu fait pleins de fonctions sur tes entrées, préfére la boucle, sinon, le array_map est plus propre je trouve.

    A savoir, le array_map peut prendre des fonctions définis soit même
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
     
    function filtre($str)
    {
        return htmlspecialchars(mysql_real_escape_string($str));
    }
     
    $tab = array_map('filtre', $_POST['supprimer']);
    Articles sur developpez.com
    - Gestion des exceptions avec PHP5
    - Chiffrement et hash en PHP contre l'attaque Man in the middle
    - Aedituus - Espace membre sécurisé en PHP5

  5. #5
    Inscrit
    Profil pro
    Inscrit en
    Juin 2006
    Messages
    531
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juin 2006
    Messages : 531
    Points : 282
    Points
    282
    Par défaut
    Et ça alors :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    <?php 
    $supprimer = array_map( 'intval', $_POST['supprimer'] ); 
    $sql = 'SELECT id FROM messagerieRecu WHERE id IN (' . implode( ', ', $supprimer) . ')'; 
    ?>
    D'après ce que j'ai pu lire, ce serait encore mieux et intraficable. Mais pourquoi ?

  6. #6
    Rédacteur

    Homme Profil pro
    Développeur Web
    Inscrit en
    Juillet 2003
    Messages
    695
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 42
    Localisation : France, Gironde (Aquitaine)

    Informations professionnelles :
    Activité : Développeur Web

    Informations forums :
    Inscription : Juillet 2003
    Messages : 695
    Points : 1 071
    Points
    1 071
    Par défaut
    Si tu sais que tu n'attend que des nombres entier, alors oui, c'est encore mieux.
    le htmlspecialchars permet de se protéger contre les XSS (Cross site scripting) en encodant les < et > (entre autres) éventuellement présents.
    Si tu fais en sorte que seul les nombres peuvent passé, alors plus de soucis de <, de > de quote ', etc...

    Mais plutot que d'appliquer intval, qui risque de te retourner des false que tu insérerait dans ta bdd, je crois qu'il vaut mieux ici faire une boucle pour vérifier si chaque élément du tableau est bien un int, sinon, tu stoppes ou tu enlèves l'élément.
    Articles sur developpez.com
    - Gestion des exceptions avec PHP5
    - Chiffrement et hash en PHP contre l'attaque Man in the middle
    - Aedituus - Espace membre sécurisé en PHP5

  7. #7
    Inscrit
    Profil pro
    Inscrit en
    Juin 2006
    Messages
    531
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juin 2006
    Messages : 531
    Points : 282
    Points
    282
    Par défaut
    Mouaif, ça m'embrouille pas mal tout ça.

    Je préfèrerai tester la valeur de $_POST['supprimer'] et effectuer ou non la requête vue ci-dessus.

    Donc je viens de faire ça :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    if(isset($_POST['supprime']) AND preg_match('/^[0-9]+$/', $_POST['supprimer']))
    {
    requête de suppression
    ;}
    Mais ça me retourne :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
     
    Warning: 
    preg_match() expects parameter 2 to be string, 
    array given in /home.2/site/www/messages-recus.php on line 32
    Forcément, puisque c'est un tableau. Donc comment puis-je faire dans ce cas ?

  8. #8
    Rédacteur

    Homme Profil pro
    Développeur Web
    Inscrit en
    Juillet 2003
    Messages
    695
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 42
    Localisation : France, Gironde (Aquitaine)

    Informations professionnelles :
    Activité : Développeur Web

    Informations forums :
    Inscription : Juillet 2003
    Messages : 695
    Points : 1 071
    Points
    1 071
    Par défaut
    une boucle ^^

    Mais ton regexp est inutile, utilise une fonction comme intval ou is_numeric (que je préfère).

    Ce que je disais, ce n'était pas de pas utiliser intval, mais plutôt de ne pas utiliser une valeur pour laquelle intval te renverrais false.

    exemple : ton $_POST est
    $_POST['supprimer'][0] = 5;
    $_POST['supprimer'][1] = 'attack';
    $_POST['supprimer'][2] = 6;

    alors intval($_POST['supprimer'][1]) renverrais false.
    mais $_POST['supprimer'][1] existera toujours puisque tu ne l'a pas effacé.
    Il n'est pas bon, il faut le virais.
    Je ferais
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    foreach ($_POST['supprimer'] as $supp)
    {
        if( is_numeric($supp))
        {
            $tabSupprimer[] = $supp;
        }
    }
    J'ai fait l'exemple avec intval, mais prend plutôt is_numeric, vu que tes nombres seront en fait des strings.
    Articles sur developpez.com
    - Gestion des exceptions avec PHP5
    - Chiffrement et hash en PHP contre l'attaque Man in the middle
    - Aedituus - Espace membre sécurisé en PHP5

+ Répondre à la discussion
Cette discussion est résolue.

Discussions similaires

  1. [JSP probleme]tableau problème d'ordre algorithmique
    Par smutmutant2003 dans le forum Servlets/JSP
    Réponses: 3
    Dernier message: 05/10/2009, 10h27
  2. Réponses: 11
    Dernier message: 13/02/2009, 09h18
  3. initialisation d'un tableau probléme
    Par id.prog dans le forum Collection et Stream
    Réponses: 5
    Dernier message: 11/04/2008, 10h27
  4. [HTML] [CSS ?] Tableau : problème avec cellules
    Par Epistoliere dans le forum Mise en page CSS
    Réponses: 8
    Dernier message: 07/08/2006, 17h04
  5. [HTML] Tableau problème de formatage avec internet Explorer
    Par rabobsky dans le forum Balisage (X)HTML et validation W3C
    Réponses: 2
    Dernier message: 18/11/2005, 09h50

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