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 :

FILTER_SANITIZE_STRING et REGEX gestion des apostrophes


Sujet :

Langage PHP

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre confirmé
    Profil pro
    Inscrit en
    Avril 2009
    Messages
    137
    Détails du profil
    Informations personnelles :
    Localisation : Suisse

    Informations forums :
    Inscription : Avril 2009
    Messages : 137
    Par défaut FILTER_SANITIZE_STRING et REGEX gestion des apostrophes
    Bonjour à tous et à toutes.

    J'ai un soucis, avec une regex. Je veux contrôler ce que l'utilisateur entre dans le champ d'un formulaire et y autoriser les apostrophes.

    or j'utilise ceci:

    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
     
    <?php
    // CLean all POST and GET
    	if(($_SERVER['REQUEST_METHOD'] == 'POST') && !empty($_GET)){
     
    		// we trim all the post array
    		$_POST = array_map('trim', $_POST);
     
    		//Strip tags, optionally strip or encode special characters.
    		$_POST = filter_input_array(INPUT_POST, FILTER_SANITIZE_STRING);
     
        }
     
        if(($_SERVER['REQUEST_METHOD'] == 'GET') && !empty($_GET)){
    		// we trim all the post array
    		$_GET = array_map('trim', $_GET);
     
    		//Strip tags, optionally strip or encode special characters.
    		$_GET = filter_input_array(INPUT_GET, FILTER_SANITIZE_STRING);
     
     
        }
    et le FILTER_SANITIZE_STRING, change mon apostrophe en &#36, si j'ai bien compris et donc ma variable ne match plus la regex suivante.

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
     
    function name_validation_regex($text){
     
     
        if(preg_match ('/^[a-zA-ZàáâäãåąčćęèéêëėįìíîïłńòóôöõøùúûüųūÿýżźñçčšžÀÁÂÄÃÅĄĆČĖĘÈÉÊËÌÍÎÏĮŁŃÒÓÔÖÕØÙÚÛÜŲŪŸÝŻŹÑßÇŒÆČŠŽ∂ð ,.\']+$/', $text)){
            return TRUE;
        }else{
            return FALSE;
        }
    }
    Je bloque dessus et j'ai essayé plusieurs solutions mais rien n'y fait.

    Merci d'avance.

  2. #2
    Expert confirmé
    Avatar de Séb.
    Profil pro
    Inscrit en
    Mars 2005
    Messages
    5 329
    Détails du profil
    Informations personnelles :
    Âge : 47
    Localisation : France

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

    Informations forums :
    Inscription : Mars 2005
    Messages : 5 329
    Billets dans le blog
    17
    Par défaut
    C'est une très mauvaise idée de travailler sur une chaîne échappée 😉

    Perso je ferais un sanitize non codant.

    Le codage doit être effectué selon le traitement suivant, ex. échappement SQL avant requête (pour se protéger des infections), codage HTML lors de l'affichage <p>Login <?= htmlspecialchars($login) ?></p> (ainsi ta data reste neutre et portable)

    Autre point, dans ta regexp tu places tes entités HTML dans un classe de caractères, elles ne seront donc pas matchées, il faudrait des parenthèses non capturantes.

    Sinon y'a un flag FILTER_FLAG_NO_ENCODE_QUOTES qui te suffira peut-être.

  3. #3
    Expert confirmé Avatar de CosmoKnacki
    Homme Profil pro
    Justicier interdimensionnel
    Inscrit en
    Mars 2009
    Messages
    2 986
    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 986
    Par défaut
    Citation Envoyé par Séb. Voir le message
    Autre point, dans ta regexp tu places tes entités HTML dans un classe de caractères
    En fait non, c'est le forum qui fait ça automatiquement avec certains caractères "trop exotiques".

  4. #4
    Membre confirmé
    Profil pro
    Inscrit en
    Avril 2009
    Messages
    137
    Détails du profil
    Informations personnelles :
    Localisation : Suisse

    Informations forums :
    Inscription : Avril 2009
    Messages : 137
    Par défaut
    Merci pour vos réponses.

    @séb: Dans la mesure ou j'utilise le modèle MVC, je me vois mal faire cette échappement ailleurs que sur mon fichier de rootage (peu-être je me trompe).

    Concernant le "FILTER_FLAG_NO_ENCODE_QUOTES", j'ai essayé rien n'y fait.

    @CosmoKnacki: Merci pour ta regex qui je te l'avoue me demandera de relire quelque tuto pour la comprendre pleinement. Cependant en la copiant collant juste afin de voir si cela resout mon problème avant de potasser malheureusement chou blanc là encore.

    nb: je vais changer le nom de la fonction comme susmentionné, mais attendant voici ce que j'ai:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    function name_validation_regex($text){
        echo $text;
        if(preg_match("~\A [\p{Latin} ,.']+ \z~ux", $text)){
            return TRUE;
        }else{
            return FALSE;
        }
    }
    ou le echo me retourne ceci (copié collé du browser): j'aa

    Je ne suis pas sûr de comprendre ce qui empêche la regex d'accepter ce texte, cependant si j'enlève complètement le sanitize la regex fonctionne correctement.

  5. #5
    Expert confirmé Avatar de CosmoKnacki
    Homme Profil pro
    Justicier interdimensionnel
    Inscrit en
    Mars 2009
    Messages
    2 986
    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 986
    Par défaut
    Ne regarde pas la page où les entités sont interprétées, regarde le code de la page : clique droit: afficher le code source de la page (ou un truc du genre), là tu verras s'il y a une entité html ou pas.

    Si tu remplaces: echo $texte; par echo implode(',', array_map(function($i){return dechex(ord($i));},str_split($texte))); qu'est ce que ça donne?

  6. #6
    Expert confirmé Avatar de CosmoKnacki
    Homme Profil pro
    Justicier interdimensionnel
    Inscrit en
    Mars 2009
    Messages
    2 986
    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 986
    Par défaut
    Citation Envoyé par helkøwsky Voir le message
    Concernant le "FILTER_FLAG_NO_ENCODE_QUOTES", j'ai essayé rien n'y fait.
    Mea culpa, avec la fonction filter_input_array les flags se passent de cette manière.

  7. #7
    Expert confirmé Avatar de CosmoKnacki
    Homme Profil pro
    Justicier interdimensionnel
    Inscrit en
    Mars 2009
    Messages
    2 986
    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 986
    Par défaut
    Rien d'étonnant car c'est ce que FILTER_SANITIZE_STRING est censé faire!

    Si tu ne souhaites pas que les simples quotes ' et les doubles-quotes " soient transformés en entités html, tu peux adjoindre le flag FILTER_FLAG_NO_ENCODE_QUOTES à ton filtre:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    $_POST = filter_input_array(INPUT_POST, FILTER_SANITIZE_STRING, FILTER_FLAG_NO_ENCODE_QUOTES);
    Maintenant, je t'invite à te demander si ce filtre est adapté à tes besoins et s'il peut s'appliquer indifféremment à tous les champs transmis en POST ou GET comme tu le fais. Peut-être faudrait-il envisager des filtres plus personnalisés. À toi de voir.

    Sinon:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    function name_validation_regex($text) {
        return (bool) preg_match("~\A [\p{Latin} ,.']+ \z~ux", $text);
    }
    Voire renomme la en name_validation tout court ou en validate_name. (Le nom d'un fonction doit faire comprendre ce qu'elle fait, pas comment elle le fait.)

    Le modificateur x ignore les espaces et autres caractères blancs dans la pattern sauf à l'intérieur d'une classe de caractères (ce qui tombe bien d'ailleurs).
    Le modificateur u permet de gérer correctement les chaînes de caractères contenant des caractères hors de la zone ASCII: ces caractères étant codés sur plusieurs octets, sans ce modificateur, ta classe de caractères peut très bien prendre n'importe quels de ces octets pour recomposer un caractère qui n'y figure pas (ce qui peut résulter à de faux positifs). Avec le modificateur, chaque caractère est vu comme une séquence d'octets indissociables et ce méli-mélo n'est plus possible. Aussi, il force la lecture de la chaîne sujet en utf-8 et renvoie une erreur lorsque l'encodage n'est pas valide.

Discussions similaires

  1. Gestion des apostrophes
    Par Invité dans le forum Langage
    Réponses: 2
    Dernier message: 20/06/2014, 15h17
  2. gestion des apostrophes dans une chaîne de caractère
    Par Klemsy78 dans le forum Langage
    Réponses: 9
    Dernier message: 16/07/2009, 16h20
  3. Réponses: 3
    Dernier message: 29/08/2008, 11h46
  4. [MySQL] Gestion des apostrophes en PHP
    Par medmans dans le forum PHP & Base de données
    Réponses: 4
    Dernier message: 26/07/2007, 16h59
  5. [Regex] gestion des accents dans un mot
    Par joseph_p dans le forum Collection et Stream
    Réponses: 5
    Dernier message: 10/05/2006, 09h04

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