8800 sujets

Développement web côté serveur, CMS

Bonjour,
Afin de vérifier la validité et la sécurité de paramètres passés dans une URL et récupérés via la méthode GET exemple :
www.monsite.com/?action=1&id=2
Est ce qu'il convient de grouper les tests dans une seule condition if, dans ce cas :
if ( isset($_GET["action"]) && is_numeric($_GET["action"]) && ($_GET["action"] == 1 )
	&& isset($_GET["id"]) && is_numeric($_GET["id"]) ) {
... traitements sur id ....
}

Ou bien, conviendrait il mieux de les séparer, dans ce cas :
if ( isset($_GET["action"]) )
    if ( is_numeric($_GET["action"]) )
         if ( $_GET["action"] == 2 )
               if ( isset($_GET["id"]) )
                     if ( is_numeric($_GET["id"]) ) {
                     ... traitements sur id ....
                     }

Merci
Salut,

les deux sont correctes mais je te conseil de séparer la vérification de l'action :
if(isset($_GET['action']) && is_numeric($_GET['action']) && isset($_GET['id']) && is_numeric($_GET['id'])){
	switch($_GET['action']){
		case 1:
			<code>
			break;
		case 2:
			<code>
			break;
		case 3:
			.
			.
			.
	}
}


Cela permet de faire la vérification de la validité des données une seule fois puis en fonction de la valeur de $_GET['action'] d'effectuer l'action qu'il convient.
Modifié par bilhackmac (11 Nov 2009 - 15:15)
Salut,

ben la tout dépend de ce que tu veux faire... et en bonus c'est bien si tu peux relire ton code dans 6 mois.

D'après ton code on dirait que les valeurs seront toujours des entiers ce qui simplifie la sécurisation. Personnellement je ferais comme ça :
$action = !empty($_GET['action']) ? (int) $_GET['action'] : 0;
$id = !empty($_GET['id']) ? (int) $_GET['id'] : 0;

if(!empty($action)) { // une variable action a été passée dans l'url
	if(!empty($id)) { // une variable id a été passée dans l'url
		switch($action) {
			case 1 :
				echo '<p>Ici on fait un INSERT de id = '.$id.'</p>';
				break;
			case 2 :
				echo '<p>Ici on fait un UPDATE de id = '.$id.'</p>';
				break;
			case 3 :
				echo '<p>Ici on fait un DELETE de id = '.$id.'</p>';
				break;
			default :
				echo '<p>Ici on fait autre chose de id = '.$id.'</p>';
		}
	} else {
		echo "<p>Erreur : L'identifiant n'est pas renseigné.</p>";
	}
}
Effectivement, le "case" est plus pratique et résoud même un gd problème de sécurité, mais comme j'ai une seule action pour l'instant j'avais groupé tous les tests...
Mon soucis était de savoir si en faisant les tests en une seule condition "if", une injection genre www.monsite.com/?action=2>1)or1&id=2 (pas forcément ça) pourrait changer le cours des tests Smiley confus même en présence du "is_numeric"... dans ce cas, le meilleur moyen est de séparer les tests... (?)
En effet, j'ai pris l'habitude de passer mes paramètres URL en valeurs numériques et faire la correspondance avec des tableaux de "string" prédéfinis quand le paramètre final est un texte, c'est plus sécurisé Smiley cligne