Précédent   Forum des professionnels en informatique > Bases de données > MySQL > SQL Procédural
SQL Procédural Forum d'entraide sur les triggers, les procédures stockées et les fonctions en MySQL
Partagez cette discussion sur d'autres réseaux sociaux : Viadeo Twitter Google Facebook Digg Delicious MySpace Yahoo
Réponse Proposer ce sujet en actualité
 
Outils de la discussion
Publicité
'
Vieux 14/08/2006, 13h07   #1
Inscrit
 
Inscription : juin 2006
Messages : 531
Détails du profil
Informations forums :
Inscription : juin 2006
Messages : 531
Points : 225
Points : 225
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 :
<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 :
1
2
3
 
$_POST['supprimer']=
htmlentities(mysql_real_escape_string($_POST['supprimer']));
La requête sql, c'est ça :
Code :
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 :
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 ?
JackBeauregard est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 14/08/2006, 14h08   #2
Rédacteur
 
Avatar de wamania
 
Développeur Web
Inscription : juillet 2003
Messages : 676
Détails du profil
Informations personnelles :
Âge : 30
Localisation : France, Gironde (Aquitaine)

Informations professionnelles :
Activité : Développeur Web

Informations forums :
Inscription : juillet 2003
Messages : 676
Points : 678
Points : 678
Citation:
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 :
 $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

Lithium : ORM ActiveRecord PHP5 extrêmement léger
wamania est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 14/08/2006, 14h20   #3
Inscrit
 
Inscription : juin 2006
Messages : 531
Détails du profil
Informations forums :
Inscription : juin 2006
Messages : 531
Points : 225
Points : 225
Oui je mettais dis, qu'il fallait utiliser une boucle.

Que penses-tu de ça, Wamania :

Code :
1
2
3
4
5
6
<?php 
$supprimer = array(); 
foreach( $_POST['supprimer'] AS $valeur ) { 
  $supprimer[] = htmlspecialchars( mysql_real_escape_string( $valeur ) ); 
} 
?>
Ou alors :

Code :
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.
JackBeauregard est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 14/08/2006, 14h28   #4
Rédacteur
 
Avatar de wamania
 
Développeur Web
Inscription : juillet 2003
Messages : 676
Détails du profil
Informations personnelles :
Âge : 30
Localisation : France, Gironde (Aquitaine)

Informations professionnelles :
Activité : Développeur Web

Informations forums :
Inscription : juillet 2003
Messages : 676
Points : 678
Points : 678
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 :
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

Lithium : ORM ActiveRecord PHP5 extrêmement léger
wamania est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 14/08/2006, 16h10   #5
Inscrit
 
Inscription : juin 2006
Messages : 531
Détails du profil
Informations forums :
Inscription : juin 2006
Messages : 531
Points : 225
Points : 225
Et ça alors :

Code :
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 ?
JackBeauregard est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 14/08/2006, 16h25   #6
Rédacteur
 
Avatar de wamania
 
Développeur Web
Inscription : juillet 2003
Messages : 676
Détails du profil
Informations personnelles :
Âge : 30
Localisation : France, Gironde (Aquitaine)

Informations professionnelles :
Activité : Développeur Web

Informations forums :
Inscription : juillet 2003
Messages : 676
Points : 678
Points : 678
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

Lithium : ORM ActiveRecord PHP5 extrêmement léger
wamania est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 14/08/2006, 16h32   #7
Inscrit
 
Inscription : juin 2006
Messages : 531
Détails du profil
Informations forums :
Inscription : juin 2006
Messages : 531
Points : 225
Points : 225
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 :
1
2
3
4
IF(isset($_POST['supprime']) AND preg_match('/^[0-9]+$/', $_POST['supprimer']))
{
requête de suppression
;}
Mais ça me retourne :
Code :
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 ?
JackBeauregard est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 14/08/2006, 17h48   #8
Rédacteur
 
Avatar de wamania
 
Développeur Web
Inscription : juillet 2003
Messages : 676
Détails du profil
Informations personnelles :
Âge : 30
Localisation : France, Gironde (Aquitaine)

Informations professionnelles :
Activité : Développeur Web

Informations forums :
Inscription : juillet 2003
Messages : 676
Points : 678
Points : 678
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 :
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

Lithium : ORM ActiveRecord PHP5 extrêmement léger
wamania est déconnecté   Envoyer un message privé Réponse avec citation 00
Réponse Proposer ce sujet en actualité Cette discussion est résolue.
Outils de la discussion



Fuseau horaire GMT +2. Il est actuellement 05h16.


 
 
 
 
Partenaires

Hébergement Web