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 :

Contrôle des caractère interdits


Sujet :

Langage PHP

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre averti
    Profil pro
    Inscrit en
    Mars 2010
    Messages
    54
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mars 2010
    Messages : 54
    Par défaut Contrôle des caractère interdits
    Bonjour,
    Je voudrais tester une variable login si elle ne contient pas de caracteres
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    $caracteres=array("#",";","//","/","%","*","drop","Drop","DROP","select","Select","SELECT","Insert","INSERT","UPDATE","Update","upadate","FROM","from","From","insert","Insert","INSERT","INTO","Into","into");
    Mais je ne sais si je dois la tester avec
    strpos
    ereg
    ergi
    Je voudrais juste savoir si elle le contient ou pas ???

  2. #2
    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
    Les fonctions ereg sont dépréciées depuis PHP 5.3, il vaut mieux donc les éviter.
    strpos est une bonne idée, mais tu devrais tester tous tes mots un par un, donc faire une boucle.
    Si tu veux tester tous les termes d'un coup, je peux te proposer un truc avec preg_match :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    $caracteres=array("#",";","//","/","%","*","drop","Drop","DROP","select","Select","SELECT","Insert","INSERT","UPDATE","Update","upadate","FROM","from","From","insert","Insert","INSERT","INTO","Into","into");
     
    $pattern = '@'.implode('|', $caracteres).'@'; //le @ sert de délimiteur, ne doit pas faire partie des mots à filtrer
    if (preg_match($pattern, $chaine_a_tester))
    {
    echo 'mot trouvé !!!!!';
    }
    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]

  3. #3
    Membre expérimenté

    Profil pro
    Inscrit en
    Juin 2002
    Messages
    6 152
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juin 2002
    Messages : 6 152
    Par défaut
    Sauf que ça ne fonctionnera pas (erreurs) dans certains cas comme avec * qui est un métacaractère. Une adaptation de la ligne implode qui devrait lever tout problème avec les métacaractères ou séparateur(s) :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    $pattern = '.' . implode('|', array_map('preg_quote', $caracteres)) . '.';
    # Si insensibilité à la casse désirée, utiliser plutôt ceci :
    #$pattern = '.' . implode('|', array_map('preg_quote', $caracteres)) . '.i';


    Sinon stripos avec une boucle. (qui évite, au passage, d'avoir à gérer la casse)

  4. #4
    Membre averti
    Profil pro
    Inscrit en
    Mars 2010
    Messages
    54
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mars 2010
    Messages : 54
    Par défaut
    J'ai fait un peu différemment mais je ne sais pas le quel est le plus précie
    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
    function strposa($haystack ,$needles=array(),$offset=0){
        $chr = array();
        foreach($needles as $needle){
            if (strpos($haystack,$needle,$offset) !== false) {
              $chr[] = strpos($haystack,$needle,$offset);
           }
        }
        if(empty($chr)) return false;
        return min($chr);
    }
     
     
     
     
    		$login = $_POST['login'];
    		$password = $_POST['password'];
    	$caracteres=array("#",";","//","/","%","*","drop","Drop","DROP","select","Select","SELECT","Insert","INSERT","UPDATE","Update","upadate","FROM","from","From","insert","Insert","INSERT","INTO","Into","into","'");
     
     
    	if (strposa($login,$caracteres) !== false or strposa($password,$caracteres) !== false) 
    	{	    
    	$domaine = gethostbyaddr($_SERVER['REMOTE_ADDR']);
    	if ( isset($_SERVER['HTTP_X_FORWARDED_FOR']) ){$ip = $_SERVER['HTTP_X_FORWARDED_FOR'];}
    	else {$ip = $_SERVER['REMOTE_ADDR'];}
    	$date = date('Y/m/d H:i');	
    	$ua = $_SERVER['HTTP_USER_AGENT'];
    	$sql = "INSERT into ip_bl (ua, ip, domaine, date, cpt, cpt_401) values ('$ua', '$ip', '$domaine', '$date', '$idcommrefins', '$idcommrefins')";
    	$req = mysql_query($sql) or die('Erreur SQL !<br>'.$sql.'<br>'.mysql_error());    
    	}



    Je bannie directement pour éviter une injection sql
    Connection réserver pour une entreprise

  5. #5
    Membre expérimenté

    Profil pro
    Inscrit en
    Juin 2002
    Messages
    6 152
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juin 2002
    Messages : 6 152
    Par défaut
    Si le but est d'éviter les injections, ceci ne sert strictement à rien et il existe des fonctions spécialisées ...

    Sinon votre fonction paraît inutilement complexe (pas besoin de recoder strpos) :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    function contains($haystack, array $needles) {
        foreach ($needles as $needle) {
            if (stripos($haystack, $needle) !== FALSE) {
                return TRUE;
            }
        }
        return FALSE;
    }
     
    if (contains($login, $caracteres) || contains($password, $caracteres)) {
        // $login ou $password contient des chaînes interdites
    } else {
        // ok
    }

  6. #6
    Membre averti
    Profil pro
    Inscrit en
    Mars 2010
    Messages
    54
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mars 2010
    Messages : 54
    Par défaut
    Pour bannir tout ce qui essaye des injections de flash quel fonction utiliser ???

+ Répondre à la discussion
Cette discussion est résolue.

Discussions similaires

  1. [Edit] Contrôle des caractères
    Par ursamajor dans le forum Interfaces Graphiques
    Réponses: 2
    Dernier message: 04/08/2011, 14h08
  2. Remplacement des caractères interdits en XML
    Par dedz dans le forum Format d'échange (XML, JSON...)
    Réponses: 0
    Dernier message: 04/05/2009, 19h03
  3. Extraction de caractères pour contrôle des minutes!
    Par js8bleu dans le forum VB 6 et antérieur
    Réponses: 4
    Dernier message: 07/07/2008, 23h30
  4. Filtrer des caractères de contrôle
    Par five1966 dans le forum VBA Access
    Réponses: 4
    Dernier message: 07/06/2008, 20h41
  5. Réponses: 1
    Dernier message: 28/05/2008, 11h52

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