suprimer une liste déroulante

Répondre


Cette question est un moyen d’empêcher des soumissions automatisées de formulaires par des robots.
Smileys
:D :) :( :o :shock: :? 8-) :lol: :x :P :oops: :cry: :evil: :twisted: :roll: :wink: :!: :?: :idea: :arrow: :| :mrgreen: =D> #-o =P~ :^o :non: :priere: 8-|
Voir plus de smileys
  Revue du sujet
 

  Étendre la vue Revue du sujet : suprimer une liste déroulante

par artotal » 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.

par Cyrano » 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.

par artotal » 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

par artotal » 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>

par Cyrano » 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

par artotal » 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".

par artotal » 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.

par Cyrano » 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

par artotal » 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.

par Cyrano » 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.

par artotal » 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

par Ryle » 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.... :)

suprimer une liste déroulante

par artotal » 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