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

PHP & Base de données Discussion :

retour exit d'une fonction


Sujet :

PHP & Base de données

  1. #1
    Membre habitué
    Inscrit en
    Avril 2004
    Messages
    513
    Détails du profil
    Informations forums :
    Inscription : Avril 2004
    Messages : 513
    Points : 127
    Points
    127
    Par défaut retour exit d'une fonction
    Bonjour à toutes et tous

    ci-dessous une partie de code simplifiée où je teste chaque données qui vont rentrer dans la bdd avec une expression régulière
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    		if(preg_match ($tab_filtre["nom"], $_POST['nom'] )){
    			$NOM = $_POST["nom"];
    			if(preg_match ($tab_filtre["prenom"], $_POST['prenom'] )){
    				$PRENOM = $_POST["prenom"];
    ICI TRAITEMENT DES DONNEES
    			}else{
    				echo "erreur de filtrage prenom ";echo'<br/>';
    			}
    		}else{
    			echo "erreur de filtrage nom ";echo'<br/>';
    		}
    	}
    Je voudrais remplacer tous ces tests successifs par une fonction ci-dessous
    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
     
    $tab_filtre = array(
        "nom" => "#^[A-ZŒ]*[\' \-A-ZŒ]*[A-ZŒ]$#",
        "prenom" => "#^[A-ZŒ][a-zœà-ÿ]*([- ][A-ZŒ][a-zœà-ÿ]*)*$#",
        "adresse" => "#(A-ZŒa-zœà-ÿ0-9\-\' ,.)*#",
    	"Code_Postal"=>"#[0-9]{5}#",
    	"MAIL"=> "#^[a-z0-9._-]+@[a-z0-9._-]{2,}\.[a-z]{2,4}$#",
    	"mdp"=> "#[0-9]{5,10}#",
    	"VILLE"=> "#^[A-ZŒ]*[\' \-A-ZŒ]*[A-ZŒ]$#",
    	"tel"=> "#^0[1-9] ([0-9]{2} ){3}[0-9]{2}$#",
    	"date"=> "#^([0-9]{2}\/){2}[0-9]{4}$#",
    	"key_confirm"=>"#[0-9]{14}#",
    	"Avoir"=>"#^[0-9]*.?[0-9]{0,2}$#",
    	);
     
    function verif($str_test){
    	global $tab_filtre;
    		if(preg_match ($tab_filtre[$str_test], $_POST[$str_test])){
    			return $_POST[$str_test];
    		}else{
    			exit("erreur ".$str_test);
    		}
    }
    Donc à la place du premier code j'aurais:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    			$NOM =verif("nom");
    				$PRENOM =verif("prenom");
    ICI TRAITEMENT DES DONNEES
    Mais bien sûr ceci ne fonctionne pas en cas d'erreur $NOM= erreur nom qui serait rentré dans ma base.
    comment traiter l'exit de cette fonction de verif

  2. #2
    Expert éminent sénior
    Avatar de mathieu
    Profil pro
    Inscrit en
    Juin 2003
    Messages
    10 401
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juin 2003
    Messages : 10 401
    Points : 15 766
    Points
    15 766
    Par défaut
    vous pouvez par exemple tester chaque valeur dans une boucle. et s'il y a une erreur, vous définissez une variable $erreur.
    après cela dépend de ce que voulez faire s'il y a une valeur qui n'est pas valide.

  3. #3
    Expert éminent Avatar de CosmoKnacki
    Homme Profil pro
    Justicier interdimensionnel
    Inscrit en
    Mars 2009
    Messages
    2 898
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Charente Maritime (Poitou Charente)

    Informations professionnelles :
    Activité : Justicier interdimensionnel

    Informations forums :
    Inscription : Mars 2009
    Messages : 2 898
    Points : 6 669
    Points
    6 669
    Par défaut
    Le fait d'éviter de répéter x fois la même chose est une bonne idée (d'autant plus qu'à l'origine chaque test semble conditionner le suivant créant ainsi une imbrication infernale). Comme mathieu, je commencerais plutôt par faire une boucle sur chaque champ en stockant les erreurs d'une manière ou d'une autre.

    Mais avant de sauter sur une fonction de la mort qui tue qui pour chaque champs sollicite une pattern précise, je me poserais la question du bien fondé des patterns en question.
    Déjà, utiliser une regex pour valider un champs peut être utile mais n'est pas forcément un gage de sécurité (en écho à ton thread précédent). Ensuite ce n'est pas toujours la meilleure solution: par exemple il existe déjà un filtre de validation d'adresse email dans PHP, ou une solution suffisante: il existe un ensemble de classes et fonctions pour manipuler les dates et vérifier que la date en question existe. Pour finir, mets-toi à la place de l'utilisateur et tu verras à quel point tu es tyrannique:
    • La casse imposée pour le nom, le prénom et la ville (Napoléon n'aurais pas fait mieux).
    • Les espaces du numéro de téléphone (La même pour César mais en chiffres romains)

    Et pour celui qui se trompe, redirection automatique vers la page Goulag.php avec conservation de l'IP pendant 50 ans!

    Plaisanterie mise à part, si tu souhaites obtenir tel ou tel formatage ou telle ou telle casse, rien ne t'empêche de transformer la chaîne reçue (c'est d'ailleurs ce qui se fait pour que les adresses postales soient en conformité avec la norme AFNOR).

    Pour plus de souplesse plutôt que d'associer un champ à une pattern, j'associerais un champ à une fonction de validation anonyme, comme ça tu n'es pas obligé de recourir à une pattern pour la validation, n'importe quel code peut convenir (ce qui sera utile notamment pour valider correctement la date).

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    [
        'nom' => function($nom) { /*...*/ },
        'prenom' => function($prenom) { /*...*/},
       // etc.
    ]
    À propos de la permissivité des formulaires, il faut garder à l'esprit que rien n'empêche quelqu'un qui s'appelle Durand d'écrire qu'il s'appelle Dupont, et que la manière imparable de s'assurer qu'une adresse email est valide (et accessible) est d'envoyer un message contenant un code de vérification (dans un lien généralement).

    À noter qu'il y a à redire sur chacune de tes patterns, mais on verra ça ultérieurement.

  4. #4
    Membre habitué
    Inscrit en
    Avril 2004
    Messages
    513
    Détails du profil
    Informations forums :
    Inscription : Avril 2004
    Messages : 513
    Points : 127
    Points
    127
    Par défaut
    Merci pour cette longue réponse.

    Bien sûr mon idée n'est pas de tyranniser les utilisateurs
    Je suis un peu paniquer par la sécurité! J'espère pouvoir gérer ma base de données sur internet et je ne voudrais pas faire d'impers.
    Dans le formulaire toutes les données de l'adhérents seront immédiatement transformées par du javascript ex : le nom sera mis en Majuscule, le N° de tel est transformé pour afficher un espace entre 2 numéros, l'adhérents n'a rien à faire. Le seul effort que l'adhérent doit faire c'est la date au format jj/mm/AAAA c'est pas trop demandé.
    Ce qui me permet de vérifier que les données reçues, par le serveur dans la variable POST, correspondent bien au expression régulière avant de les enregistrer dans la base de données.

    La fonction pour vérifier toutes mes données je l'ai faite (elle est dans le premier post) mais ce que je voulais c'est comment ma fonction pouvait renvoyer le résultat négatif. Je ne voulais pas refaire une fonction qui renvoie vrai ou faux qui oblige à tester le résultat.

    Je ne me suis pas encore pencher sur les fonctions anonymes, je ne sais pas comment ça fonctionne. Je crois que c'est la même fonction que j'ai fait en retours elle donne par ex le Nom si il est validé mais s'il n'est pas valide que donne t'elle cette fonction ? Il faudrait qu'elle stocke l'erreur dans une table et qu'avant de passer les données à la base je vérifie si la table d'erreur est vide.

    J'ai bien vu dans la fonction que je proposais la sortie pas exit ne retournait rien dans la variable Nom.

    J'ai bien conscience qu'un malveillant peu tenter de tester des noms, ce problème est résolu à la connexion avec vérification du mot de passe. et lors de la création de son mot de passe par un mail de vérification avec clef.

    Je profite de tes connaissances (si tu veux bien):
    lorsque j'envois des données de ma base, puisque je sais exactement comment les données sont rentrées et formatées ce n'est pas la peine que je les teste à l'affichage dans les inputs de la page html.

    autre question : comment un malveillant peut il faire exécuter du code javascript sur le PC d'une victime?
    lorsqu'un malveillant met du code javascript dans un input ou directement dans l'url ce code est lu par le serveur comment peut il retourner vers une victime?

    Encore Merci

  5. #5
    Expert éminent sénior
    Avatar de mathieu
    Profil pro
    Inscrit en
    Juin 2003
    Messages
    10 401
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juin 2003
    Messages : 10 401
    Points : 15 766
    Points
    15 766
    Par défaut
    Citation Envoyé par marco62118 Voir le message
    autre question : comment un malveillant peut il faire exécuter du code javascript sur le PC d'une victime?
    lorsqu'un malveillant met du code javascript dans un input ou directement dans l'url ce code est lu par le serveur comment peut il retourner vers une victime?
    ce qui se fait souvent, dans le cas d'applications qui ne sont pas sécurisées, est que l'utilisateur malveillant indique un code du genre <script>...</script> dans un champ. et quand ce code est affiché sur une page html, le code javascript est exécuté. et comme ce code est dans la page, il a accès au cookie de connexion et donc à toutes les données qui sont normalement restreintes par un mot de passe. ensuite le code javascript peut envoyer ces données au serveur de l'utilisateur malveillant.

    Citation Envoyé par marco62118 Voir le message
    lorsque j'envois des données de ma base, puisque je sais exactement comment les données sont rentrées et formatées ce n'est pas la peine que je les teste à l'affichage dans les inputs de la page html.
    c'est à cet endroit qu'il vaut mieux utiliser "htmlspecialchars" même si vous pensez que vous contrôlez la valeur des champs. ainsi dans le cas où quelque chose comme "<script>" arrive à passer, les chevrons seront transformés pour s'afficher dans la page html et donc aucun code s’exécutera.
    php.net/htmlspecialchars

  6. #6
    Membre habitué
    Inscrit en
    Avril 2004
    Messages
    513
    Détails du profil
    Informations forums :
    Inscription : Avril 2004
    Messages : 513
    Points : 127
    Points
    127
    Par défaut
    Merci Mathieu pour t a réponse

    l'utilisateur malveillant indique un code du genre <script>...</script> dans un champ. et quand ce code est affiché sur une page html,
    lorsque une page html est demandée: le serveur renvoi bien cette page au demandeur et pas à quiconque.
    Si je mets un code <script> dans un input, c'est bien moi qui vais voir le retour de cette page avec <script> dans l'input et pas un autre.

    ou il faudrait que le malveillant se connecte avec les identifiants d'une victime
    qu'il remplace par ex le nom avec un <script> à l'intérieur
    que le serveur l'accepte et l'enregistre dans la base
    et quand la victime se reconnecte elle reçoive le script à la place de son nom!
    Est-ce ça le principe ?

  7. #7
    Expert éminent
    Avatar de Séb.
    Profil pro
    Inscrit en
    Mars 2005
    Messages
    5 236
    Détails du profil
    Informations personnelles :
    Âge : 46
    Localisation : France

    Informations professionnelles :
    Secteur : High Tech - Opérateur de télécommunications

    Informations forums :
    Inscription : Mars 2005
    Messages : 5 236
    Points : 8 499
    Points
    8 499
    Billets dans le blog
    17
    Par défaut
    lorsque une page html est demandée: le serveur renvoi bien cette page au demandeur et pas à quiconque.
    Tout dépend de ce que tu fais de la saisie. Si la saisie est un message qui sera publié, par exemple un message d'un forum, alors tous les visiteurs affichant le message auront le <script> exécuté. Dans tous les cas les données doivent être protégées, quelque soit leur usage final.

    Autre point sur le format des données en base. Exemple : tu fais un htmlspecialchars() à l'insertion en base, le jour où tu dois exporter tes données en CSV/JSON tu te retrouves avec des &quot; qui ne veulent plus rien dire dans ces formats. Si lors du nouvel import htmlspecialchars() est encore réutilisé (ça pourrait être toi qui réutilise les mêmes scripts d'insertion), on se retrouve des &amp;quot; Mieux vaut toujours être le plus neutre possible en base, cela permet de faire ce que l'ont veut des données selon le besoin du moment sans avoir à défaire ce qui a été fait à tort.

  8. #8
    Membre habitué
    Inscrit en
    Avril 2004
    Messages
    513
    Détails du profil
    Informations forums :
    Inscription : Avril 2004
    Messages : 513
    Points : 127
    Points
    127
    Par défaut
    Merci Seb

    Je comprends mieux.

    Ok dans la base les données sont vérifiées sans utiliser htmlspécialchar comme tu as pu le voir je vais utiliser des expressions régulières et lorsque je ferai des écho j'utiliserai htmlspecialchar.

Discussions similaires

  1. [12c] Insérer retour chariot dans une fonction
    Par coolmek dans le forum SQL
    Réponses: 1
    Dernier message: 18/09/2019, 16h05
  2. Réponses: 3
    Dernier message: 19/03/2008, 22h11
  3. [VB.net]Gérer un Application.Exit() dans une fonction
    Par arnolem dans le forum Windows Forms
    Réponses: 1
    Dernier message: 24/05/2006, 14h03
  4. retour de variable d'une fonction
    Par thunderblade dans le forum ASP
    Réponses: 4
    Dernier message: 28/04/2005, 13h27
  5. Retour NULL d'une fonction utilisateur
    Par tiboleo dans le forum MS SQL Server
    Réponses: 3
    Dernier message: 18/11/2004, 15h40

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