IdentifiantMot de passe
Loading...
Mot de passe oublié ?Je m'inscris ! (gratuit)
Navigation

Inscrivez-vous gratuitement
pour pouvoir participer, suivre les réponses en temps réel, voter pour les messages, poser vos propres questions et recevoir la newsletter

Langage PHP Discussion :

Sécuriser un formulaire


Sujet :

Langage PHP

  1. #1
    Membre régulier Avatar de Caranille
    Homme Profil pro
    Développeur Web
    Inscrit en
    Août 2013
    Messages
    117
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Seine Saint Denis (Île de France)

    Informations professionnelles :
    Activité : Développeur Web
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Août 2013
    Messages : 117
    Points : 70
    Points
    70
    Par défaut Sécuriser un formulaire
    Bonjour,

    C'est avec une petite larme à l'oeil que je viens vers vous car je suis désemparé face à un problème que je ne peux gérer. Vous êtes mes derniers secours...

    J'ai donc un script PHP pour un petit jeu de type RPG donc voici un module:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    41
    42
    43
    44
    45
    46
    47
    48
    49
    50
    51
    52
    53
    54
    55
    56
    57
    58
    59
    60
    61
    62
    63
    64
    65
    66
    67
    68
    69
    70
    71
    72
    73
    74
    75
    76
    77
    78
    79
    80
    81
    82
    83
    84
    85
    86
    87
    88
    89
    90
    <?php
    error_reporting(E_ALL); 
    $timestart = microtime(true);
    session_start();
    require_once $_SESSION['File_Root']. '/Kernel/Include.php';
    require_once $_SESSION['File_Root']. '/HTML/Header.php';
    if (isset($_SESSION['ID'])){
    	if ($_SESSION['Town'] == 1){
    		if (empty($_POST['Battle'])){
    			echo "$Dungeon_0";
    			$Town_ID = htmlspecialchars(addslashes($_SESSION['Town_ID']));
    			$recherche_monstre = $bdd->prepare("SELECT * FROM Caranille_Monsters
    				WHERE Monster_Town = ?
    				AND Monster_Access = 'Battle'");
    			$recherche_monstre->execute(array($Town_ID));
    			while ($monstre = $recherche_monstre->fetch()){
    				$Monster_Image = stripslashes($monstre['Monster_Image']);
    				$Monster_ID = stripslashes($monstre['Monster_ID']);
    				echo "<img src=\"$Monster_Image\"><br />";
    				echo "" .stripslashes($monstre['Monster_Name']). "<br />";
    				echo "" .stripslashes(nl2br($monstre['Monster_Description'])). "<br />";
    				echo "HP: " .stripslashes($monstre['Monster_HP']). "<br />";
    				echo "MP: " .stripslashes($monstre['Monster_MP']). "<br />";
    				echo '<form method="POST" action="Dungeon.php">';
    				echo "<input type=\"hidden\" name=\"Monster_ID\" value=\"$Monster_ID\">";
    				echo "<input type=\"submit\" name=\"Battle\" value=\"$Dungeon_1\">";
    				echo '</form><br />';
    			}
    			$recherche_monstre->closeCursor();
    			if (empty($Monster_ID)){
    				echo "$Dungeon_2";
    			}
    		}
    		if (isset($_POST['Battle'])){
    			$Monster_ID = htmlspecialchars(addslashes($_POST['Monster_ID']));
    			$Town_ID = htmlspecialchars(addslashes($_SESSION['Town_ID']));
    			$Monster_Access = "Battle";
    			$recherche_monstre = $bdd->prepare("SELECT * FROM Caranille_Monsters 
    				WHERE Monster_ID = ?
    				AND Monster_Town = ?
    				AND Monster_Access = ?");
    			$recherche_monstre->execute(array($Monster_ID, $Town_ID, $Monster_Access));
    			while ($monstre = $recherche_monstre->fetch()){
    				$Monster_Image = stripslashes($monstre['Monster_Image']);
    				echo "<img src=\"$Monster_Image\"><br />";
    				echo "" .$monstre['Monster_Name']. "<br />";
    				echo "" .stripslashes(nl2br($monstre['Monster_Description'])). "<br />";
    				echo "HP: ???<br />";
    				echo "MP: ???<br />";
    				$_SESSION['Monster_ID'] = stripslashes($monstre['Monster_ID']);
    				$_SESSION['Monster_Image'] = stripslashes($monstre['Monster_Image']);
    				$_SESSION['Monster_Name'] = stripslashes($monstre['Monster_Name']);
    				$_SESSION['Monster_Description'] = stripslashes(nl2br($monstre['Monster_Description']));
    				$_SESSION['Monster_Level'] = stripslashes($monstre['Monster_Level']);
    				$_SESSION['Monster_Strength'] = stripslashes($monstre['Monster_Strength']);
    				$_SESSION['Monster_Defense'] = stripslashes($monstre['Monster_Defense']);
    				$_SESSION['Monster_HP'] = stripslashes($monstre['Monster_HP']);
    				$_SESSION['Monster_Experience'] = stripslashes($monstre['Monster_Experience']);
    				$_SESSION['Monster_Golds'] = stripslashes($monstre['Monster_Golds']);
    				$_SESSION['Monster_Item_One'] = stripslashes($monstre['Monster_Item_One']);
    				$_SESSION['Monster_Item_One_Rate'] = stripslashes($monstre['Monster_Item_One_Rate']);
    				$_SESSION['Monster_Item_Two'] = stripslashes($monstre['Monster_Item_Two']);
    				$_SESSION['Monster_Item_Two_Rate'] = stripslashes($monstre['Monster_Item_Two_Rate']);
    				$_SESSION['Monster_Item_Three'] = stripslashes($monstre['Monster_Item_Three']);
    				$_SESSION['Monster_Item_Three_Rate'] = stripslashes($monstre['Monster_Item_Three_Rate']);
    				$_SESSION['Monster_Item_Four'] = stripslashes($monstre['Monster_Item_Four']);
    				$_SESSION['Monster_Item_Four_Rate'] = stripslashes($monstre['Monster_Item_Four_Rate']);
    				$_SESSION['Monster_Item_Five'] = stripslashes($monstre['Monster_Item_Five']);
    				$_SESSION['Monster_Item_Five_Rate'] = stripslashes($monstre['Monster_Item_Five_Rate']);
    				$_SESSION['Battle'] = 1;
    				$_SESSION['Arena_Battle'] = 0;
    				$_SESSION['Chapter_Battle'] = 0;
    				$_SESSION['Dungeon_Battle'] = 1;
    				$_SESSION['Mission_Battle'] = 0;
    				echo '<form method="POST" action="Battle.php">';
    				echo "<input type=\"submit\" name=\"lancer_donjon\" value=\"$Dungeon_3\">";
    				echo '</form>';
    			}
    			$recherche_monstre->closeCursor();
    		}
    	}
    	if ($_SESSION['Town'] == 0){
    		echo "$Dungeon_4";
    	}
    }
    else{
    	echo "$Dungeon_5";
    }	
    require_once $_SESSION['File_Root'] .'/HTML/Footer.php';
    ?>
    Comme vous pouvez le voir quand l'utilisateur valide le premier formulaire il arrive à la seconde partie du script qui va chercher le monstre en fonction de son ID ($Monster_ID = htmlspecialchars(addslashes($_POST['Monster_ID'])) ) qui à été envoyé par le champs hidden.

    Sauf que si je sauvegarde le site en local je peux modifier cet id et hop je combat un monstre non prévu. Résultat je souhaiterai savoir si il existe une fonction pour savoir si l'utilisateur arrive sur cette page en étant passé par la page officiel ou si il est passé depuis une copie du site sur son disque dur auquel il a modifié l'ID.

    Merci par avance

  2. #2
    Modérateur
    Avatar de sabotage
    Homme Profil pro
    Inscrit en
    Juillet 2005
    Messages
    29 208
    Détails du profil
    Informations personnelles :
    Sexe : Homme

    Informations forums :
    Inscription : Juillet 2005
    Messages : 29 208
    Points : 44 155
    Points
    44 155
    Par défaut
    Ton problème est plutôt dans la conception : le tirage doit être fait au moment du combat et pas une page avant.

    Au passage, retire tes htmlspecialchars(addslashes()) et donc tes stripslashes() ça date de la prehistoire de PHP et ça n'a plus de sens dans le cadre de requêtes préparées PDO.
    htmlspecialchars() tout seul sert quand tu affiches des données externes dans une page HTML.

  3. #3
    Membre régulier Avatar de Caranille
    Homme Profil pro
    Développeur Web
    Inscrit en
    Août 2013
    Messages
    117
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Seine Saint Denis (Île de France)

    Informations professionnelles :
    Activité : Développeur Web
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Août 2013
    Messages : 117
    Points : 70
    Points
    70
    Par défaut
    Merci de ta réponse, mais j'admet être un peu perdu car je fais ce projet à titre personnel et non professionnel donc je sais qu'il me manque beaucoup de chose à connaitre.

    Car actuellement il y a la première page ou le joueur choisit le monstre qu'il veut combat, chaque monstre à un ID
    Quand il clique sur combattre cela envoi dans le formulaire l'id du monstre dans un champ de type hidden qui est ensuite utilisé pour récupérer toutes les informations du monstre.

    Si tu as un exemple (sans refaire le script car je souhaite apprendre) je suis preneur car je ne vois pas du tout la logique que tu me propose d'appliquer

    Cordialement,

  4. #4
    Modérateur
    Avatar de sabotage
    Homme Profil pro
    Inscrit en
    Juillet 2005
    Messages
    29 208
    Détails du profil
    Informations personnelles :
    Sexe : Homme

    Informations forums :
    Inscription : Juillet 2005
    Messages : 29 208
    Points : 44 155
    Points
    44 155
    Par défaut
    Ah d'accord je comprends mieux ton problème.
    Je suppose que pour réaliser le combat tu dois faire une requête pour recolter les informations sur le monstre. Tu peux donc en même temps filtrer les monstres qui ne seraient pas prévus.

  5. #5
    Membre régulier Avatar de Caranille
    Homme Profil pro
    Développeur Web
    Inscrit en
    Août 2013
    Messages
    117
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Seine Saint Denis (Île de France)

    Informations professionnelles :
    Activité : Développeur Web
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Août 2013
    Messages : 117
    Points : 70
    Points
    70
    Par défaut
    C'est celà oui. Il y a déjà un filtre. Le premier pour chercher les monstres auxquel le joueur peut combattre et ensuite il valide sont choix et la je refais un nouveau filtre pour verifier si l'id du monstre envoyé par le formulaire correspondant bien a un monstre que le joueur peut combattre

    par exemple j'utilise google chrome avec l'extension pour afficher le code source. Je change l'id du formulaire et là je peux combattre le monstre de mon choix tant que je connais son id.

    Enfaite je cherchais une technique pour éviter ce doublon qui consiste a chercher le monstre et a verifier si ce monstre est combattable

  6. #6
    Modérateur
    Avatar de sabotage
    Homme Profil pro
    Inscrit en
    Juillet 2005
    Messages
    29 208
    Détails du profil
    Informations personnelles :
    Sexe : Homme

    Informations forums :
    Inscription : Juillet 2005
    Messages : 29 208
    Points : 44 155
    Points
    44 155
    Par défaut
    Toute donnée provenant de l'utilisateur doit être contrôlée.
    Dans ton cas, ce n'est pas un doublon puisque dans tous les cas tu dois faire la requête pour exploiter l'id reçu.

  7. #7
    Membre habitué
    Homme Profil pro
    Développeur Web
    Inscrit en
    Février 2015
    Messages
    107
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 34
    Localisation : France, Vendée (Pays de la Loire)

    Informations professionnelles :
    Activité : Développeur Web

    Informations forums :
    Inscription : Février 2015
    Messages : 107
    Points : 139
    Points
    139
    Par défaut
    Salut,

    Plutôt qu'un champ hidden, tu ne pourras pas passer par une variable de session ? Je suis pas sûr que ça augmente vraiment la sécurité dans le cas que tu présentes par contre.

  8. #8
    Membre régulier
    Avatar de sourcilpower
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Janvier 2011
    Messages
    128
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Rhône (Rhône Alpes)

    Informations professionnelles :
    Activité : Développeur informatique
    Secteur : Agroalimentaire - Agriculture

    Informations forums :
    Inscription : Janvier 2011
    Messages : 128
    Points : 124
    Points
    124
    Billets dans le blog
    2
    Par défaut
    Salut,

    je te conseil plutôt d'utiliser un système de token tu sha1 ton formulaire avant de l'envoyer et apres tu sha1 les données reçu et tu compare les deux token . Si ils sont différent tu renvoi une erreur.
    TOUT DOIT SE FAIRE COTE PHP !!!

  9. #9
    Modérateur
    Avatar de sabotage
    Homme Profil pro
    Inscrit en
    Juillet 2005
    Messages
    29 208
    Détails du profil
    Informations personnelles :
    Sexe : Homme

    Informations forums :
    Inscription : Juillet 2005
    Messages : 29 208
    Points : 44 155
    Points
    44 155
    Par défaut
    Ca consiste en quoi "sha1iser" un formulaire ?

  10. #10
    Membre régulier
    Avatar de sourcilpower
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Janvier 2011
    Messages
    128
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Rhône (Rhône Alpes)

    Informations professionnelles :
    Activité : Développeur informatique
    Secteur : Agroalimentaire - Agriculture

    Informations forums :
    Inscription : Janvier 2011
    Messages : 128
    Points : 124
    Points
    124
    Billets dans le blog
    2
    Par défaut
    Citation Envoyé par sabotage Voir le message
    Ca consiste en quoi "sha1iser" un formulaire ?
    quand tu rempli ton formulaire ou autre tu concatène tes champs et tu les "sha1" puis a la réception tu fait pareil et comme ça tu peut vérifier sans trucage si les données sont correcte.

    je sais pas si tu me comprend

  11. #11
    Modérateur
    Avatar de sabotage
    Homme Profil pro
    Inscrit en
    Juillet 2005
    Messages
    29 208
    Détails du profil
    Informations personnelles :
    Sexe : Homme

    Informations forums :
    Inscription : Juillet 2005
    Messages : 29 208
    Points : 44 155
    Points
    44 155
    Par défaut
    Ok je vois mais ca n'empeche pas la donnée d'être falsifiée sur l'envoi du premier formulaire ou l'utilisateur fait le choix.

  12. #12
    Membre régulier
    Avatar de sourcilpower
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Janvier 2011
    Messages
    128
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Rhône (Rhône Alpes)

    Informations professionnelles :
    Activité : Développeur informatique
    Secteur : Agroalimentaire - Agriculture

    Informations forums :
    Inscription : Janvier 2011
    Messages : 128
    Points : 124
    Points
    124
    Billets dans le blog
    2
    Par défaut
    si c'est des données initialiser il peut toujours le faire avec les token

Discussions similaires

  1. sécuriser un formulaire par une équation
    Par aboura86 dans le forum Langage
    Réponses: 8
    Dernier message: 03/07/2008, 19h03
  2. Sécuriser mon formulaire
    Par isa150183 dans le forum Langage
    Réponses: 3
    Dernier message: 07/10/2007, 19h34
  3. Sécuriser un formulaire
    Par Z3c33 dans le forum Sécurité
    Réponses: 3
    Dernier message: 25/05/2007, 15h52
  4. Sécuriser un formulaire
    Par jerem78 dans le forum Sécurité
    Réponses: 2
    Dernier message: 07/06/2006, 18h02

Partager

Partager
  • Envoyer la discussion sur Viadeo
  • Envoyer la discussion sur Twitter
  • Envoyer la discussion sur Google
  • Envoyer la discussion sur Facebook
  • Envoyer la discussion sur Digg
  • Envoyer la discussion sur Delicious
  • Envoyer la discussion sur MySpace
  • Envoyer la discussion sur Yahoo