suprimer une liste déroulante

Mammouth du PHP | 601 Messages

28 oct. 2006, 03:39

Bonjour,
Je me fais un cms enfin j'ai presque finis.
dans le back office, j'aimerai suprimer le titre de rubrique, et la je bloque.
pour récupérer les elements du formulaire.
http://creatif-web.be/assoc/admin/suprimer_rubrique.php
Donc ce code fonctionne très bien.
 <form method="POST" action="<?php echo $_SERVER['PHP_SELF']; ?>">
 	<fieldset>
		<legend>Suprimer une rubrique</legend><label for="nom"></label>
<?php  
 echo '<select name="liste[]">';

$query = "SELECT * FROM pages order by page";
$result = mysql_query($query, $lien);
for ($i=0; $i < mysql_num_rows($result); $i++)
  {
	$ok = mysql_fetch_array($result);
	echo '
	<option name="'.$ok[0].'">'.$ok[0].' ['.$ok[1].' ]</option>';
  }
  echo '</select>';?>
		<input type="submit" name="envoi" value="envoie" /></p>	
	</fieldset>
</form>
Mais je n'arrive pas à récuperer ?
      if(isset($_REQUEST['ok']))
      {
	 echo 'ok c ok';
/*	 $nom=$_REQUEST['nom'];
	 $description=$_REQUEST['description'];
	$query = "DELETE FROM pages WHERE page=$nom";
    $result = mysql_query($query);
    return $result;*/
    }
    else
    {
    echo 'erreur mon grand';
    }
Merci
http://xavier-artot.com
¨'°-.,¸¸,.-·²°'´¨'°-.,¸¸,.-·²°'´¨'°-.,¸¸,.-·°'´¨
système d'exploitation "Ubuntu 7.10"

Avatar du membre
Modérateur PHPfrance
Modérateur PHPfrance | 10684 Messages

28 oct. 2006, 11:24

Quand tu dis que tu n'y arrives pas, c'est probablement parce que ça ne fonctionne pas (vu que j'imagine que tu as du essayé sans les commentaires ;)), mais qu'est ce qui t'arrive concrêtement ? Tu as un message d'erreur ? Tu as un résultat qui est différent de celui que tu attends mais dont tu ne veux pas ous faire part ? ...

- Est ce que tu rentres bien dans le if() ? Est ce que tu vois apparaitre le 'ok c ok' ? si ce n'est pas le cas, ton problème vient du $_REQUEST['ok'] qui n'est pas renseigné, il faut donc aller voir côté formulaire les paramètres que tu passes : as tu un champ qui s'appele "ok" ?
- Supposons que tu rentres dans le if, que contiennent $_REQUEST['nom'] et/ou $nom que tu utilises dans ta requête ? les as tu affiché pour vérifier leur valeurs ?
- Supposons que ce soit la suppression en base qui ne fonctionne pas : Tu génères une requête sql, l'as tu affiché pour vérfiié qu'elle était valide ? l'as tu essayé directement dans mysql ?
A mon avis, d'après le nom de tes variables, avec un "or die (mysql_error())" après le mysql_query() (ou en exécutant la requête générée dans mysql) tu verrais rapidement qu'il y a quelque chose d'incorrect dans la syntaxe de ta requête au niveau de ta condition.... :)
Ce n'est pas en améliorant la bougie que l'on a inventé l'ampoule...

Mammouth du PHP | 601 Messages

28 oct. 2006, 12:34

j'ai corrigé un peu mon test, j'ai bien ok ok qui s'affiche.
if(isset($_REQUEST['liste']))
	{
		 echo 'ok ok';
		$nom=$_REQUEST['liste'];
		$query = "DELETE FROM pages WHERE page=$nom";
		$result = mysql_query($query);
		return $result;
	}
else
	{
		echo 'erreur mon grand';
	}
La requete fonctionne je l'ai tester dans mysql
Modifié en dernier par artotal le 28 oct. 2006, 12:38, modifié 1 fois.
http://xavier-artot.com
¨'°-.,¸¸,.-·²°'´¨'°-.,¸¸,.-·²°'´¨'°-.,¸¸,.-·°'´¨
système d'exploitation "Ubuntu 7.10"

Mammouth du PHP | 19672 Messages

28 oct. 2006, 12:37

Ta requête est très dangereuse : $_REQUEST peut contenir à la fois les valeurs contenues dans $_POST et dans $_GET : si un pirate t'envoie en paramètre d'url ajouté à la main du code SQL, il pourrait attaquer ta base de donner et tout écraser.
Codez en pensant que celui qui maintiendra votre code est un psychopathe qui connait votre adresse :axe:

Mammouth du PHP | 601 Messages

28 oct. 2006, 12:40

oui mais je ne vois pas comment il pourrai faire ?
Ce que tu évoques m"interresse...
Si sait post on le vois rapidement et si c'est get aussi.
http://xavier-artot.com
¨'°-.,¸¸,.-·²°'´¨'°-.,¸¸,.-·²°'´¨'°-.,¸¸,.-·°'´¨
système d'exploitation "Ubuntu 7.10"

Mammouth du PHP | 19672 Messages

28 oct. 2006, 12:44

Oui, mais si tu utilises $_REQUEST, PHP vérifiera les deux même si dans ton code tu envoies normalement avec $_POST : il faudrait un coup de malchance, mais c'est une faille de sécurité dans ton script. Donc, il faut soit utiliser $_POST soit $_GET mais dans ce dernier cas tout comme avec $_REQUEST il faut traiter la donnée envoyée pour t'assurer qu'elle ne contient pas autre chose que le type de valeurs attendue et non du code SQL
Codez en pensant que celui qui maintiendra votre code est un psychopathe qui connait votre adresse :axe:

Mammouth du PHP | 601 Messages

28 oct. 2006, 12:47

je me mes un troll ;-)
Ta fonction fonctionne du tonnerre, en veux tu en voilà...
http://creatif-web.be/assoc/
Je ne sais pas si sa plait mais moi je suis conquit.
http://xavier-artot.com
¨'°-.,¸¸,.-·²°'´¨'°-.,¸¸,.-·²°'´¨'°-.,¸¸,.-·°'´¨
système d'exploitation "Ubuntu 7.10"

Mammouth du PHP | 601 Messages

28 oct. 2006, 12:52

je suis pas convaincu par la faille mais je vais quand même marché dans tes pas, en production j'utiliserai "post".
http://xavier-artot.com
¨'°-.,¸¸,.-·²°'´¨'°-.,¸¸,.-·²°'´¨'°-.,¸¸,.-·°'´¨
système d'exploitation "Ubuntu 7.10"

Mammouth du PHP | 19672 Messages

28 oct. 2006, 13:31

je suis pas convaincu par la faille
Ok, alors je vais reprendre l'explication autrement.

Dans les variables superglobales, nous avons entre autres $_POST, $_GET et $_REQUEST : cette dernière contient les deux précédentes.

Supposons que tu utilises la méthode post dans ton formulaire. Les données sont envoyées via $_POST. En apparence, pas de problème. Mais dans ton script, tu te sers non pas de $_POST mais de $_REQUEST.

Dans ton code, tu as ceci :
//..
        $nom=$_REQUEST['liste'];
        $query = "DELETE FROM pages WHERE page=$nom";
Maintenant, imagines 30 seconde, je suis un sale pirate amateur de destructions gratuites en tous genres. Au lieu de passer par ton formulaire, je mets dans ma barre de navigation une url pointant directement vers la page de traitement que, pour les besoins de l'exemple, je nommerai traitement.php : l'url que je mets est : http://tonsite.com/traitement.php?liste=0+OR+1+%3D+1

À la réception, je récupère : "0 OR 1 = 1" : ta requête va donc devenir :

Code : Tout sélectionner

DELETE FROM pages WHERE page=0 OR 1 = 1;
Et partant de là, à ton avis, il va se passer quoi ? :-k
Codez en pensant que celui qui maintiendra votre code est un psychopathe qui connait votre adresse :axe:

Mammouth du PHP | 601 Messages

28 oct. 2006, 13:56

oui je vois.
1=1 ou liste=1 dans mon cas.
Mais il peux aussi effacer n'importe lequel d'enrregistrement, en rentrant la variable et dans mon cas la valeur.
Je n'avais pas vu ce point de vue.
Donc si je me protège des injections:

Code : Tout sélectionner

$nom=mysql_real_escape_string($nom);
Il n'y $_REQUEST n'est plus un problème ?
################################### FIN DE CONNEXION #########
if(isset($_REQUEST['liste']))
	{
		 echo 'ok ok';
		$liste=$_REQUEST['liste'];
		$liste=mysql_real_escape_string('$liste');
		$query = "DELETE FROM pages WHERE page=$liste";
		$result = mysql_query($query);
		return $result;
	}
else
	{
		echo 'erreur mon grand';
	}
?>
<form method="GET" action="<?php echo $_SERVER['PHP_SELF']; ?>">
	<fieldset>
		<legend>Suprimer une rubrique</legend><label for="nom"></label>
<?php  
 echo '<select name="liste[]">';

$query = "SELECT * FROM pages order by page";
$result = mysql_query($query, $lien);
for ($i=0; $i < mysql_num_rows($result); $i++)
  {
	$ok = mysql_fetch_array($result);
	echo '
	<option name="'.$ok[0].'">'.$ok[0].' ['.$ok[1].' ]</option>';
  }
  ?>
</select>
		<p><input type="submit" name="envoi" value="envoie" /></p>	
	</fieldset>
</form>
http://xavier-artot.com
¨'°-.,¸¸,.-·²°'´¨'°-.,¸¸,.-·²°'´¨'°-.,¸¸,.-·°'´¨
système d'exploitation "Ubuntu 7.10"

Mammouth du PHP | 601 Messages

28 oct. 2006, 14:20

je crois que mon problème vient que j'utilise un tableau indexer et que la réception attend une valeur inconnu ?
D'ailleurs je ne comprend pas pourquoi dans la 'affichage de ma liste en faisant ok[0] et ok[1] j'ai le premier et le deuxième champ respectivement.
Dans le doute je pense que c'est un tableau multidimentionnel
http://xavier-artot.com
¨'°-.,¸¸,.-·²°'´¨'°-.,¸¸,.-·²°'´¨'°-.,¸¸,.-·°'´¨
système d'exploitation "Ubuntu 7.10"

Mammouth du PHP | 19672 Messages

28 oct. 2006, 15:47

non, tu n'as pas correctement compris : j'ai bien mis "1 = 1" et non "liste = 1" Et là il va se passer quoi ? ça va te vider la table purement et simplement aussi efficacement qu'un TRUNCATE TABLE. Et c'est ça que j'essaye de te faire réaliser depuis tout à l'heure.
Codez en pensant que celui qui maintiendra votre code est un psychopathe qui connait votre adresse :axe:

Mammouth du PHP | 601 Messages

28 oct. 2006, 16:15

j'ai trouvé :
if(isset($_POST['liste']))
	{
		 echo 'ok ok';
		$ok=$_POST['liste'];
		print_r($_POST); 
		//$liste=mysql_real_escape_string('$ok');
		echo '<br />Affichage de la variable $ok == '.$ok;
		$query = "DELETE FROM pages WHERE page='$ok'";
		$result = mysql_query($query);
	}
else
	{
		echo 'erreur mon grand<br />';
		print_r($_POST);
	}
?>
<form method="POST" action="<?php echo $_SERVER['PHP_SELF']; ?>">
	<fieldset>
		<legend>Suprimer une rubrique</legend><label for="nom"></label>
<?php  
 echo '<select name="liste">';

$query = "SELECT * FROM pages order by page";
$result = mysql_query($query, $lien);
for ($i=0; $i < mysql_num_rows($result); $i++)
  {
	$ok = mysql_fetch_array($result);
	echo '<option value="'.$ok[0].'">'.$ok[0].' ['.$ok[1].' ]</option>';
  }
  ?>
</select>
		<p><input type="submit" name="envoi" value="envoie" /></p>	
	</fieldset>
</form>
Merci à tous.
http://xavier-artot.com
¨'°-.,¸¸,.-·²°'´¨'°-.,¸¸,.-·²°'´¨'°-.,¸¸,.-·°'´¨
système d'exploitation "Ubuntu 7.10"