8791 sujets

Développement web côté serveur, CMS

Bonjour tout le monde,

Je trie mes colonnes de mon tableau, tout ce passe bien.

J'ai voulu sécuriser le $_GET['Sort'] mais je rencontre quelques difficultés :

if((isset($_GET['Sort'])) && (in_array($tri,$Tableau_Noms_Des_Champs)) || ($_GET['Sort'] == "" ))


Ce code fonctionne (sans doute car je ne sais pas comment contourner un Get pour tester)

Le tri ce fait, mais après le nom des colonnes disparaissent.

Sauriez-vous me dire ce que je dois faire svp ?

Voici le code de ma page pour ceux à qui cela peut intéresser :

<!--Si la variable de type get à une information ou si la variable de session LaTable à une donnée alors on fait tout cela-->
<?php if((isset($_GET['select_Nom_Tables'])) OR (isset($_SESSION['LaTable']))){ ?>
<table border="1" id="TableauUpdate">
<?php
//Je crée une variable de session ici afin que le nom de la table puisse etre utilisé dans le script "Mettre a jour".
if(isset($_GET['select_Nom_Tables'])) 
	{
		$table = $_GET['select_Nom_Tables'];
	}
else 
	{
		$table = $_SESSION['LaTable'];
	}
		$_SESSION['LaTable'] = $table;


//si je clic sur un nom de champ, une valeur get se met dans l'adresse 
if(isset($_GET['Sort'])) 
	{
		$tri = "ORDER BY ".$_GET['Sort'];
	} 
else 
	{
		$tri = "";
	}
			  
$query = mysql_query("SELECT * FROM ".$table." ".$tri."") or exit(mysql_error());
$num_rows = mysql_num_rows($query) or exit(mysql_error());
//echo($table);

//echo $num_rows ." lignes dans la table " . $table."\n"; 

$Tableau_Noms_Des_Champs = array();  
  
for($j=0;$j<mysql_num_fields($query);$j++) 
{ 
   $Tableau_Noms_Des_Champs[] = mysql_field_name($query, $j); 
   //echo(mysql_field_name($query,$j));
}
//var_dump($Tableau_Noms_Des_Champs);

?>
<?php if ($num_rows > 0) 
{?>
<form action="" method="post" name="frmSaisie" id="frmSaisie">
<tr><td>&nbsp;</td>
<?php 
//++++++++++++++++++++++++affichage des noms de colonnes +++++++++++++++++++++++++++++++++
for($i=0;$i<mysql_num_fields($query);$i++)
		{
		//afin de ne pas afficher l'ID dans les pages de consultations, je dis que si le nom du champ actuel est 'ID', je l'ignore
		if(mysql_field_name($query,$i) != 'ID')
			{
//cursos:pointer transforme la flèche en main pour les liens
//self.location.href recharge la page
//?Sort= le nom du champ que l'on veut trier
//je sécurise le GET en testant si la valeur retournée dans l'URL est bien dans le tableau (in_array) ou que le get soit vide
if((isset($_GET['Sort'])) && (in_array($_GET['Sort'], $Tableau_Noms_Des_Champs)) || ($_GET['Sort'] == "" )){ 
	echo '<td style="cursor:pointer" onclick="self.location.href=\'EntreeDeDonnees.php?Sort='.$Tableau_Noms_Des_Champs[$i].'&Table='.$table.'\'">'.$Tableau_Noms_Des_Champs[$i].'</td>';

}
		}
		}
?>
</tr>
<?php 
$nligne = 0;
$nbColonnes = 0;
while($row = mysql_fetch_array($query,MYSQL_ASSOC)) 
{
	echo '<tr><td><input name="sup['.$row['ID'].']" type="checkbox" value="'.$row['ID'].'" /></td>';
	foreach($row as $NomCol => $Valeur)
	{
		//si le nom de la colonne vaut 'ID', je l'ignore afin de ne pas afficher l'ID
		if($NomCol != 'ID'){
		echo '<td><input name="new[' . $row['ID'] . '][' . $NomCol . ']" value="'.$Valeur.'"></td>';	}
	}
	echo '</tr>';
}

echo '</tr>';


?>
<!--ici j'appelle le script javascript ci-dessous par le clic sur un bouton-->
<input type="submit" name="btnUpdate" value="Mettre a jour" onClick="UpdateSQL()" />
<input type="submit" name="btnInsertInto" value="Ajouter un enregistrement" onClick="InsertIntoSQL()" />
<input type="submit" name="btnDelete" value="Supprimer un enregistrement" onClick="DeleteSQL()" />
</form>
<?php }?>
<?php if ($num_rows == 0) { ?>
<form action="" method="post" name="frmSaisie" id="frmSaisie">
<tr><td>&nbsp;</td>
<input type="submit" name="btnInsertInto" value="Ajouter un enregistrement" onClick="InsertIntoSQL()" />
</form>
<?php } ?>
</table>

<?php } else { ?>
<table border="1" id="TableauUpdate">
<tr><td>Aucune table n'a été sélectionnée</td></tr>
</table>
<?php } ?>
<!--le script ci-dessous me permet d'avoir plusieurs actions pour un seul formulaire-->
<script langage='javascript'>
function UpdateSQL()
{
	document.forms['frmSaisie'].action ='MettreAJour.php';
	document.forms['frmSaisie'].submit();
//	document.test.submit();

}
function InsertIntoSQL()
{
	document.forms['frmSaisie'].action ='Scripts/Insert_Into_Generation_Chaine_SQL.php';
	//si je laisse cette ligne, IE ajoute deux lignes.
	//document.forms['frmSaisie'].submit();
}
function DeleteSQL()
{
	document.forms['frmSaisie'].action ='Scripts/Delete_SQL.php';
	document.forms['frmSaisie'].submit();
}
</script>


Merci d'avance.

beegees
Modifié par beegees (06 Nov 2008 - 10:46)
Heyoan a écrit :
Hello beegees,

sans aller plus loin ce serait plutôt
if((isset($_GET['Sort'])) && (in_array([b]$_GET['Sort'][/b], $Tableau_Noms_Des_Champs)) || ($_GET['Sort'] == "" ))

Sinon pour "contourner un GET" il suffit de modifier l'url : au lieu de mettre http://monsite.com/mapage.php?Sort=champ1 tu mets http://monsite.com/mapage.php?Sort=champ2


Hello Heoyan,

Un super grand merci pour ta réponse qui résout enfin mon problème.

Je ne comprends pas bien pourquoi il fallait absolument mettre le $_GET['Sort'] ?

Merci aussi pour l'explication sur le contournement du GET.

beegees
You're welcome ! Smiley jap

beegees a écrit :


Je ne comprends pas bien pourquoi il fallait absolument mettre le $_GET['Sort'] ?
Parce que le test vérifie que le champ passé en paramètre (valeur de Sort) fait bien partie de la liste des champs possibles mais dans $tri, s'il n'est pas vide, tu auras "ORDER BY NomDuChamp" et le test ne sera donc jamais vérifié. Smiley cligne


Si tu considères que ce sujet est [Résolu] merci de l'indiquer en éditant ton premier post et en modifiant le titre. Smiley cligne
Re,

Merci pour l'explication.

J'ai compris maintenant.

Merci encore pour tout.

J'édite mon titre.

beegees
Merci pour le Résolu.

Par contre ce n'est pas très sympa d'avoir supprimé le code complet que tu avais fourni au départ car du coup les explications ne veulent plus dire grand chose et surtout parce que le principal intérêt d'un forum est de pouvoir non seulement dépanner la personne qui pose une question mais de rester disponible à d'éventuelles recherches futures pour d'autres personnes. Sinon on supprimerait chaque sujet dès qu'il est résolu. Smiley cligne

D'autant que de mémoire il ne comportait rien de gênant comme une url devant rester discrète ou ce genre de choses...
oops, sorry.

J'ai juste voulu rendre le message plus "lisible" en retirant le code qui pour moi ne servait à rien.

Je le remets de suite.

Bonne journée.

beegees