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 :

Protéger ses formulaires


Sujet :

Langage PHP

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre confirmé 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
    Par défaut Protéger ses formulaires
    Bonjour,

    Je viens à vous car je suis un développeur PHP mais pas un bon développeur en terme de sécurité. J'utilise les htmlspecialchars et autres fonctions pour formatter des données mais j'ai un soucis, dont voici l'exemple

    Code html : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    <form method="POST" action="index.php">
    <input type="text" name="pseudo">
    <input type="hidden" name="<?php $Access; ?>">
    <input type="submit" name="Envoyer">
    </form>

    et dans ma page index.php j'ai

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    $Access = htmlspecialchars(addslashes($_POST['Access']));
    le problème est que si une personne le souhaite elle peut télécharger la page ou il y a le formulaire et peut modifier la valeur du champ acces qui est soit membre ou soit admin.

    De plus je ne me vois pas refaire une Requête SQL pour vérifier une nouvelle fois si la personne est juste membre ou Admin (Sinon pour de gros formulaire je serais obliger de faire une requête pour les affichers et une autre pour vérifier les champs hidden qui passent des paramètres

    N'y a t'il pas une fonction en PHP qui permettrais de voir si les données envoyée proviennent bien du site (avec l'adresse) et non pas d'un fichier sur son ordinateur ?

    Cordialement, Jérémy

  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
    Par défaut
    N'y a t'il pas une fonction en PHP qui permettrais de voir si les données envoyée proviennent bien du site (avec l'adresse) et non pas d'un fichier sur son ordinateur ?
    Tu interprètes mal le fonctionnement client-serveur : les données envoyées par un formulaire viennent dans tous les cas d'un fichier sur l'ordinateur du client et pas du serveur.

    Ce qu'il te faut c'est une session PHP : tu inscris le droit de l'utilisateur et il sera le même ensuite sur toutes les pages.
    N'oubliez pas de consulter les FAQ PHP et les cours et tutoriels PHP

  3. #3
    Membre confirmé 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
    Par défaut
    Un exemple, j'ai créer un RPG Textuel, l'utilisateur peut aller dans son inventaire qui affiche la liste de ses objets et il peut les vendre.

    Chaque objet à un ID envoyé en paramètre dans un champ hidden.

    Le problème est que il peut modifier cet id pour vendre un objet qu'il ne possède pas.

    Exemple: Il a une potion qui possède l'id 1, la potion se vend 50 pièce d'or

    il peut enregistrer le formulaire au format .html et modifier le champs hidden avec l'id 2 qui se vent 200 pièces d'or

    Il faut donc que je revérifie dans la base de donnée si celui-ci possède bien l'objet ?

    Voici le lien github du formulaire en question (Oui je ne fais pas de POO mais du procédural car je n'aime pas trop la POO en PHP)
    https://github.com/Caranille/Caranil.../Inventory.php

  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
    Par défaut
    Oui il faut contrôler les données reçues : toute donnée provenant d'un utilisateur peut être falsifiée.

    Au passage tout tes htmlspecialchars, addslashes et stripslashes sont à retirer.
    Tu ne dois avoir des htmlspecialchars que quand tu affiches une chaine de caractère, pas pour travailler avec la base de données.

    Je ne sais pas non plus à quoi correspondent tes $Inventory_1 à $Inventory_50 mais ce n'est pas une façon de travailler.

    Tu as beaucoup de code qui est répété avec simplement quelques données différentes, il faut le factoriser dans une fonction et utiliser plus de boucles.
    Tu utilises des requêtes préparées mais tu n'en tires pas parti

    Regarde par exemple ce qu'on pourrait faire simplement sans exagerer la réecriture :
    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
    $lstEffects  = array('Item_HP_Effect', 'Item_MP_Effect', 'Item_Strength_Effect', 'Item_Magic_Effect',  'Item_Agility_Effect',  'Item_Defense_Effect');
     
    if (isset($_POST['Item'])) {
     
    	$Item_Query = $bdd->prepare("SELECT * FROM Caranille_Inventory
            JOIN Caranille_Items ON Inventory_Item_ID = Item_ID
    	WHERE Item_Type = ?
    	AND Inventory_Account_ID = ?
    	ORDER BY Item_Name");
     
    	echo '<p>'  . $Inventory_33 . '</p>';
    	echo '<table>
    			<tr>
    				<td>' . $Inventory_11 . '</td>
    				<td>' . $Inventory_12 . '</td>
    				<td>' . $Inventory_14 . '</td>
    				<td>' . $Inventory_15 . '</td>
    				<td>' . $Inventory_16 . '</td>
    				<td>' . $Inventory_17 . '</td>
    			</tr>';
     
    	$arItem_types = ('Health', 'Magic');
     
    	foreach ($arItem_types as $item_type) {
    		$Item_Query->execute(array($item_type, $ID));
    		while ($Item = $Item_Query->fetch()) {
    			echo '<tr>
    					<td>' . htmlspecialchars($Item['Item_Name']). '</td>
    					<td>' . htmlspecialchars($Item['Item_Description']). '</td>
    					<td>' . htmlspecialchars($Item['Inventory_Item_Quantity']). '</td>
    					<td>';
    			foreach ($lstEffects as $effect_name) {
    				echo '+' . htmlspecialchars($Item[$effect_name]). '</br>';
    			}
    			echo 	'</td>
    				<td>
    					<form method="POST" action="Inventory.php">
    						<input type="hidden" name="Item_ID" value="' . $Item['Item_ID'] . '">
    						<input type="hidden" name="Item_Name" value="' . $Item['Item_Name'] . '">
    					</form>
    					<form method="POST" action="Inventory.php">
    						<input type="hidden" name="Inventory_ID" value="' . $Item['Inventory_ID'] . '">
    						<input type="hidden" name="Item_ID" value="' . $Item['Item_ID'] . '">
    						<input type="submit" name="Sale" value="' . $Inventory_26 . '"><br /><br />
    					</form>
    				</td>
    			</tr>';
    		}
    	$Item_Query->closeCursor();
    	}
    }
    Attention également, les jointures s'écrivent avec JOIN et pas dans une clause WHERE.
    N'oubliez pas de consulter les FAQ PHP et les cours et tutoriels PHP

  5. #5
    Membre confirmé 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
    Par défaut
    Ce sont des fichiers de langue.

    au lieu d'écrire le texte directement dans le fichier il y a un fichier avec toutes les phrases (Pour une traduction français, anglais)

  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
    Par défaut
    Dans tous les cas n'utilise pas des noms de variable sans sens.
    Mieux, utilise des constantes qui pourront être utilisés sans contrainte dans les fonctions.
    Encore mieux, utilise gettext pour gérer toute la traduction.
    N'oubliez pas de consulter les FAQ PHP et les cours et tutoriels PHP

  7. #7
    Modératrice
    Avatar de Celira
    Femme Profil pro
    Développeuse PHP/Java
    Inscrit en
    Avril 2007
    Messages
    8 633
    Détails du profil
    Informations personnelles :
    Sexe : Femme
    Âge : 41
    Localisation : France

    Informations professionnelles :
    Activité : Développeuse PHP/Java
    Secteur : Industrie

    Informations forums :
    Inscription : Avril 2007
    Messages : 8 633
    Par défaut
    Principe de base des interfaces Web : NEVER TRUST USER INPUT ! (ne jamais faire confiance à l'utilisateur)
    A associer avec les 3 règles comportementales :
    - l'utilisateur est bête (exemple : si tu lui demande de taper une date, il va peut-être taper 10/12/2014 ou peut-être 2014-12-10)
    - l'utilisateur est maladroit (exemple : il va cliquer sur le bouton d'à côté par erreur)
    - l'utilisateur est méchant (exemple : "tiens, je vais cliquer là où il ya écrit 'ne pas cliquer ici'")

    Pour tes fichiers de langues, tu pourrais p'tet utiliser des variables avec des noms un chouia plus explicites. Par exemple : $libelle_inventory_weapon au lieu de $Inventory_1.
    Modératrice PHP
    Aucun navigateur ne propose d'extension boule-de-cristal : postez votre code et vos messages d'erreurs. (Rappel : "ça ne marche pas" n'est pas un message d'erreur)
    Cherchez un peu avant poser votre question : Cours et Tutoriels PHP - FAQ PHP - PDO une soupe et au lit !.

    Affichez votre code en couleurs : [CODE=php][/CODE] (bouton # de l'éditeur) et [C=php][/C]

Discussions similaires

  1. [1.x] Comment protéger ses formulaires contre les spams
    Par farhaenis dans le forum Débuter
    Réponses: 27
    Dernier message: 05/03/2011, 13h04
  2. protéger ses images
    Par histoblog dans le forum Delphi
    Réponses: 15
    Dernier message: 20/11/2006, 18h35
  3. protéger un formulaire des robots
    Par mlm@wmginfo.com dans le forum Servlets/JSP
    Réponses: 2
    Dernier message: 03/08/2006, 19h33
  4. [Sécurité] protéger un formulaire des robots-spammeurs
    Par Djakisback dans le forum Langage
    Réponses: 10
    Dernier message: 07/07/2006, 13h02
  5. Comment protéger ses sources?
    Par Titeuf21121 dans le forum Autres Logiciels
    Réponses: 7
    Dernier message: 25/03/2004, 07h47

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