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écurité] fonction protéger une chaine


Sujet :

Langage PHP

  1. #1
    Rédacteur
    Avatar de Halleck
    Homme Profil pro
    Consultant PHP
    Inscrit en
    Mars 2003
    Messages
    597
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 37
    Localisation : France, Loiret (Centre)

    Informations professionnelles :
    Activité : Consultant PHP

    Informations forums :
    Inscription : Mars 2003
    Messages : 597
    Points : 878
    Points
    878
    Par défaut [Sécurité] fonction protéger une chaine
    Bonjour tout le monde,

    j'essaye de faire une fonction pour protéger les injections lors d'une saisie formulaire, mais je galère un peu, je commence à me perdre

    J'ai grisé les lignes qui selon moi étaient des doublons, mais je ne suis sûr de rien

    J'ai fait beaucoup de copier-coller, des tutos de sécurité de developpez, et aussi de la doc PHP, donc fouillis :
    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
     
    /**
     * protéger une chaine de caractère des injections, SQL OU NON
     * @param string chaine bah la chaine - non null
     * @param string précise s'il s'agit de protéger une chaine en vue d'une insertion dans une base de données : oui : <> null et <> 0; non : nul ou 0
     * @param string corr si différent de null, corrige au lieu de supprimer : oui : <> null et <> 0; non : nul ou 0
     * @return string la chaine protégée / génére l'erreur - fontion alert_erreur()
    */
    function str_protege($chaine,$sql=0,$corr=0)
    {
        if (is_string(@$chaine) & isset($chaine)) {
     
     
        	$chaine = trim($chaine);
     
    			// éviter attaques dos : désactivé
    		//$chaine = escapeshellcmd($chaine);
            //$chaine = escapeshellarg($chaine);			
    		//$chaine = htmlentities($chaine, ENT_QUOTES, 'ISO-8859-1');
     
     
     
            	// éviter le javascript
            $aAllowedTags = array();
            $aDisabledAttributes = array('onabort', 'onactivate', 'onafterprint', 'onafterupdate',
    		 'onbeforeactivate', 'onbeforecopy', 'onbeforecut', 'onbeforedeactivate', 
    		 'onbeforeeditfocus', 'onbeforepaste', 'onbeforeprint', 'onbeforeunload', 
    		 'onbeforeupdate', 'onblur', 'onbounce', 'oncellchange', 'onchange', 'onclick', 
    		 'oncontextmenu', 'oncontrolselect', 'oncopy', 'oncut', 'ondataavaible', 
    		 'ondatasetchanged', 'ondatasetcomplete', 'ondblclick', 'ondeactivate', 
    		 'ondrag', 'ondragdrop', 'ondragend', 'ondragenter', 'ondragleave', 
    		 'ondragover', 'ondragstart', 'ondrop', 'onerror', 'onerrorupdate', 
    		 'onfilterupdate', 'onfinish', 'onfocus', 'onfocusin', 'onfocusout', 
    		 'onhelp', 'onkeydown', 'onkeypress', 'onkeyup', 'onlayoutcomplete', 
    		 'onload', 'onlosecapture', 'onmousedown', 'onmouseenter', 'onmouseleave', 
    		 'onmousemove', 'onmoveout', 'onmouseover', 'onmouseup', 'onmousewheel', 
    		 'onmove', 'onmoveend', 'onmovestart', 'onpaste', 'onpropertychange', 
    		 'onreadystatechange', 'onreset', 'onresize', 'onresizeend', 'onresizestart', 
    		 'onrowexit', 'onrowsdelete', 'onrowsinserted', 'onscroll', 'onselect', 
    		 'onselectionchange', 'onselectstart', 'onstart', 'onstop', 'onsubmit', 'onunload');
            	if (empty($aDisabledAttributes))
    			{ 
    				$chaine =  strip_tags($chaine, implode('', $aAllowedTags));
    			} else {
    				$chaine =  preg_replace('/<(.*?)>/ie', "'<' . preg_replace(array('/javascript:[^\"\']*/i', '/(" . implode('|', $aDisabledAttributes) . ")[ \\t\\n]*=[ \\t\\n]*[\"\'][^\"\']*[\"\']/i', '/\s+/'), array('', '', ' '), stripslashes('\\1')) . '>'", strip_tags($chaine, implode('', $aAllowedTags)));
     
    			}
     
     
            	// éviter caracs non autorisés en sql, insérer les quotes
    		if($sql != 0) { 
    			$chaine = strip_tags($chaine);
    			$chaine = mysql_real_escape_string($chaine); 
    		} else {
     
     
    			// désactivé car fait dans le preg_replace
    			//if (!get_magic_quotes_gpc()) { $chaine = addslashes($chaine); } 
     
     
    			// échapper les cractères php \ + * ? [ ^ ] $ ( ) { } = ! < > | :
    			//$chaine = preg_quote($chaine);
     
    			if(isset($corr) & @$corr != '' & $corr != 0) 
    			{
    				$chaine = htmlspecialchars($chaine, ENT_QUOTES, 'ISO-8859-1');
    			} else
    			{
    				$chaine = strip_tags($chaine);
    			}
     
     
     
    		}
     
     
    		// bloquer le script en cas d'attaque
            $chaine = str_replace(';', '&#x3B', $chaine);         
            return $chaine;
     
     
        } else {
     
            alert_erreur('TYPE INCCORECT',__line__,__file__);
     
        }
    }

    résultat :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    echo str_protege('mot1<mot2mot3<? echo "jjj"; ?>mot4?mot5"mot6\'mot7');
    => mot1
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    echo str_protege('mot1?mot2mot3<? echo "jjj"; ?>mot4?mot5"mot6\'mot7');
    => mot1?mot2mot3mot4?mot5"mot6'mot7

    Dans le cas 2, la chaine s'arrête au < . Est-elle tronquée ou bien le code derrière est-il lu et executé?

    Dans le cas 2, même question pour "<? echo "jjj"; ?> ?


    Pfiouuu ! Dur ! Merci d'avance pour votre aide
    Zend PHP Certified Engineer, Certifié Symfony2
    blog : blog.lepine.pro
    Secrétaire de l'AFUP (Association des Utilisateurs de PHP)

  2. #2
    Membre expérimenté
    Avatar de Rakken
    Homme Profil pro
    Inscrit en
    Août 2006
    Messages
    1 257
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations forums :
    Inscription : Août 2006
    Messages : 1 257
    Points : 1 341
    Points
    1 341
    Par défaut
    Et si tu te contentais d'écrire un truc du genre :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    echo htmlentities($str, ENT_QUOTES);
    ?
    Rakken

    Oneira, un monde imaginaire d'Heroic Fantasy.

    Parce que la présomption d'innocence est un des fondements de notre pays et qu'elle doit le rester, dans tous les domaines : http://www.laquadrature.net/

  3. #3
    Rédacteur
    Avatar de Halleck
    Homme Profil pro
    Consultant PHP
    Inscrit en
    Mars 2003
    Messages
    597
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 37
    Localisation : France, Loiret (Centre)

    Informations professionnelles :
    Activité : Consultant PHP

    Informations forums :
    Inscription : Mars 2003
    Messages : 597
    Points : 878
    Points
    878
    Par défaut
    il me manquerait la protection de la base de données + la protection contre les scripts javascript + le choix de remplacer / supprimer les balises contrôlées.

    J'étais parti là-dessus au départ mais ça m'a paru trop faible.
    Zend PHP Certified Engineer, Certifié Symfony2
    blog : blog.lepine.pro
    Secrétaire de l'AFUP (Association des Utilisateurs de PHP)

  4. #4
    Nouveau membre du Club
    Profil pro
    Inscrit en
    Janvier 2007
    Messages
    42
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Janvier 2007
    Messages : 42
    Points : 27
    Points
    27
    Par défaut
    il y a une fonction qui pourrait te permettre de faire ce que tu veux :

    strip_tags — Supprime les balises HTML et PHP d'une chaîne:

    string strip_tags ( string $str [, string $allowable_tags ] )

    Pour la base de données il ne te reste plus qu'à utiliser des requêtes préparés
    Aprés il te reste le javascript à supprimer dans les balises autorisés.

  5. #5
    Rédacteur
    Avatar de Halleck
    Homme Profil pro
    Consultant PHP
    Inscrit en
    Mars 2003
    Messages
    597
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 37
    Localisation : France, Loiret (Centre)

    Informations professionnelles :
    Activité : Consultant PHP

    Informations forums :
    Inscription : Mars 2003
    Messages : 597
    Points : 878
    Points
    878
    Par défaut
    elle est déjà dans le code plus haut

    merci de votre aide. Ce qu'il me manque ce n'est pas tant les fonctions qu'une bonne compréhension de leurs effets. Et savoir ce que devient le "<?php echo "jjj"; ?> du code m'aiderait beaucoup je pense, enfin j'espère
    Zend PHP Certified Engineer, Certifié Symfony2
    blog : blog.lepine.pro
    Secrétaire de l'AFUP (Association des Utilisateurs de PHP)

  6. #6
    Membre émérite Avatar de darkstar123456
    Homme Profil pro
    Développeur Web
    Inscrit en
    Mars 2008
    Messages
    1 896
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 39
    Localisation : Belgique

    Informations professionnelles :
    Activité : Développeur Web

    Informations forums :
    Inscription : Mars 2008
    Messages : 1 896
    Points : 2 835
    Points
    2 835
    Par défaut
    Code php : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
     
    if (is_string(@$chaine) & isset($chaine))
    Condition incorrecte... tu n'as pas doublé le &

    correction:
    Code php : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
     
    if (is_string(@$chaine) && isset($chaine))

    Bon... je continue de lire le code plus loin... ^^


    EDIT : Pour le reste, je pense qu'une bonne utilisation de strip_tags() & htmlspecialchars() devrait suffire et alléger ton code

  7. #7
    Membre expérimenté
    Avatar de Rakken
    Homme Profil pro
    Inscrit en
    Août 2006
    Messages
    1 257
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations forums :
    Inscription : Août 2006
    Messages : 1 257
    Points : 1 341
    Points
    1 341
    Par défaut
    Et si tu te contentais d'écrire un truc du genre :

    Code :
    echo htmlentities($str, ENT_QUOTES);
    il me manquerait la protection de la base de données + la protection contre les scripts javascript + le choix de remplacer / supprimer les balises contrôlées.

    J'étais parti là-dessus au départ mais ça m'a paru trop faible.
    Hummm... non.
    En fait, ca te transforme tout les caractères un peu vicieux (genre < > ' " é è et autres joyeusetée) en truc du genre &lt; &gt; ...
    Donc c'est protégé, et plutot bien en fait. L'avantage, c'est également que si le gars écrit "<coucou>", eh bien a l'écran, on verra bien s'afficher "<coucou>", mais en base, ce qui est stocké est "&lt;coucou&gt;" ce qui est tout a fait sur. Les <? ou <script></script> ne sont donc jamais interprété, puisque le caractère "<" n'arrive jamais en base, il est traduit avant. Et il n'arrive jamais a la page html, c'est &lt; qui est affiché.
    Rakken

    Oneira, un monde imaginaire d'Heroic Fantasy.

    Parce que la présomption d'innocence est un des fondements de notre pays et qu'elle doit le rester, dans tous les domaines : http://www.laquadrature.net/

  8. #8
    Membre confirmé Avatar de mathieugamin
    Profil pro
    Inscrit en
    Octobre 2006
    Messages
    572
    Détails du profil
    Informations personnelles :
    Âge : 44
    Localisation : France

    Informations forums :
    Inscription : Octobre 2006
    Messages : 572
    Points : 627
    Points
    627
    Par défaut
    Salut
    Tu peux ajouter la fonction mysql_real_escape_string($variable) pour ta base.

    C'est généralement performant
    GAMIN !!!!
    _______________________________________________
    PHP 5.2 | Apache 2 | MySQL 5 | WinXP Pro | Mac OSX

  9. #9
    Membre expert
    Avatar de s.n.a.f.u
    Homme Profil pro
    Développeur Web
    Inscrit en
    Août 2006
    Messages
    2 760
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 49
    Localisation : France, Loire Atlantique (Pays de la Loire)

    Informations professionnelles :
    Activité : Développeur Web

    Informations forums :
    Inscription : Août 2006
    Messages : 2 760
    Points : 3 545
    Points
    3 545
    Par défaut
    Utiliser PDO (ou une autre abstraction) qui permet (souvent) d'utiliser des paramètres incluant des fonctions de protection contre l'injection SQL. Idéal pour les fainéants...
    • Avant de poser une question, n'hésitez pas à chercher dans la FAQ et les forums
    • Merci d'utiliser les balises de code (# dans l'éditeur)
    • N'oubliez pas de vous servir des boutons , et

    S.N.A.F.U

  10. #10
    Membre confirmé Avatar de mathieugamin
    Profil pro
    Inscrit en
    Octobre 2006
    Messages
    572
    Détails du profil
    Informations personnelles :
    Âge : 44
    Localisation : France

    Informations forums :
    Inscription : Octobre 2006
    Messages : 572
    Points : 627
    Points
    627
    Par défaut
    Citation Envoyé par jml94 Voir le message
    Utiliser PDO (ou une autre abstraction) qui permet (souvent) d'utiliser des paramètres incluant des fonctions de protection contre l'injection SQL. Idéal pour les fainéants...
    Oui c'est vrai !
    Pourquoi ré-inventer la roue ?
    PDO fait déjà tout cela !
    GAMIN !!!!
    _______________________________________________
    PHP 5.2 | Apache 2 | MySQL 5 | WinXP Pro | Mac OSX

  11. #11
    Membre expérimenté

    Homme Profil pro
    Inscrit en
    Janvier 2004
    Messages
    1 249
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Secteur : Finance

    Informations forums :
    Inscription : Janvier 2004
    Messages : 1 249
    Points : 1 565
    Points
    1 565
    Par défaut
    Citation Envoyé par mathieugamin Voir le message
    Pourquoi ré-inventer la roue ?
    J'y vois 2 raisons :

    * Ma roue c'est ma roue, pas la roue de quelqu'un d'autre ! (Tu ne convoitera pas la roue de ton voisin)
    * La roue du voisin c'est une roue de tracteur, avec rainures profondes de 5cm alors que moi je veux juste une roue de trottinette ;o)

  12. #12
    Membre expert
    Avatar de s.n.a.f.u
    Homme Profil pro
    Développeur Web
    Inscrit en
    Août 2006
    Messages
    2 760
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 49
    Localisation : France, Loire Atlantique (Pays de la Loire)

    Informations professionnelles :
    Activité : Développeur Web

    Informations forums :
    Inscription : Août 2006
    Messages : 2 760
    Points : 3 545
    Points
    3 545
    Par défaut
    Citation Envoyé par Fladnag Voir le message
    J'y vois 2 raisons :

    * Ma roue c'est ma roue, pas la roue de quelqu'un d'autre ! (Tu ne convoitera pas la roue de ton voisin)
    * La roue du voisin c'est une roue de tracteur, avec rainures profondes de 5cm alors que moi je veux juste une roue de trottinette ;o)
    * Michelin fabrique des roues depuis des lustres, et a une horde de chercheurs qui ont testé le truc. Avant que ton pneu en pelure de Babybel ne soit du même niveau, ily a pas mal de sueur et de tests à passer.

    * Quand on est dans le caca, même avec de l'élan, c'est pas facile de s'en sortir en trottinette...

    Plus sérieusement, j'entends tes arguments, mais ils ne s'appliquent que dans très peu de cas : grosses applis propriétaires avec des specs techniques particulières et de gros besoin d'optimisation.
    Mais dans la plupart des cas rencontrés ici, à savoir des sites webs souvent petits, c'est pas utile de fabriquer ta trottinette à réaction, non ?
    • Avant de poser une question, n'hésitez pas à chercher dans la FAQ et les forums
    • Merci d'utiliser les balises de code (# dans l'éditeur)
    • N'oubliez pas de vous servir des boutons , et

    S.N.A.F.U

  13. #13
    Membre expérimenté

    Homme Profil pro
    Inscrit en
    Janvier 2004
    Messages
    1 249
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Secteur : Finance

    Informations forums :
    Inscription : Janvier 2004
    Messages : 1 249
    Points : 1 565
    Points
    1 565
    Par défaut
    Bon, j'ai pas donné tout mes arguments, mais si tu veux que je sois sérieux je peux ^^

    Exemple concret : Pourquoi est-ce que je n'aime pas phpbb et que je ne l'installerais jamais sur mon site ?

    * Des failles sont trouvées de temps en temps, parce que le code est libre et parce qu'il évolue. Choses bonnes en soi mais au niveau sécurité c'est une plaie
    * Même si beaucoup de choses ont été faites dans les dernières versions sur les perfs, ca reste une usine a gaz.
    * La customisation ne remplace pas une vraie interface ad hoc totalement différente

    Sinon on peux aussi dire que :
    * Si personne ne cherche a recoder ce qui existe, dans 10 ans plus personne ne saura le coder...
    * Coder dans une optique de sécurité permet de se poser les bonnes questions (est-ce que cette variable est filtrée ? un cookie est il sur ? un utilisateur malveillant peut il modifier cette donnée ? etc...) et d'apprendre... a développer un code plus sécurisé, ou a corriger un code existant ou il reste une faille.
    * Personnellement, je n'ai pas confiance en mon garagiste... alors que je le vois... alors l'ingénieur de michelin que j'ai jamais vu... Pour certaines choses je n'ai pas le choix. Mais quand je l'ai, je préfère me fier a ce que je fais.

    Je posterais ici ce soir (si j'y pense ^^) une classe que j'ai développée et qui gère toutes les variables (GET/POST/SESSION/FILE) et toutes leurs utilisations (HTML, SQL, donnée "brute")

  14. #14
    Membre expérimenté
    Avatar de Rakken
    Homme Profil pro
    Inscrit en
    Août 2006
    Messages
    1 257
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations forums :
    Inscription : Août 2006
    Messages : 1 257
    Points : 1 341
    Points
    1 341
    Par défaut
    Et puis après, les roues des autres ne sont pas forcement tout a fait ronde. J'ai vu cité PDO juste au dessus par exemple.
    Quelqu'un a déjà essayé d'utiliser pdo avec oracle ? Personnellement, ca a été la seule fois de ma vie ou j'ai réussi à faire un "segmentation fault" (erreur bien connue des codeurs en C) en php.
    Et si on veut utiliser des CLOB, alors là, c'est le drame absolu... Mais voila, l'appli de base était faite pour mysql, alors le choix de pdo mysql a été tout a fait interessant, avec l'optique "et en plus, ca va marcher tout seul sous oracle, ou presque).
    Un truc maison, on aurait pu l'adapter là... ben il a fallut faire avec, et les clob sont devenu des blobs, avec toutes les stupidités d'implémentation que ca entraine...
    Vive les roues de tracteur quand on veut rouler sur une piste cyclable...
    Rakken

    Oneira, un monde imaginaire d'Heroic Fantasy.

    Parce que la présomption d'innocence est un des fondements de notre pays et qu'elle doit le rester, dans tous les domaines : http://www.laquadrature.net/

  15. #15
    Membre expert
    Avatar de s.n.a.f.u
    Homme Profil pro
    Développeur Web
    Inscrit en
    Août 2006
    Messages
    2 760
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 49
    Localisation : France, Loire Atlantique (Pays de la Loire)

    Informations professionnelles :
    Activité : Développeur Web

    Informations forums :
    Inscription : Août 2006
    Messages : 2 760
    Points : 3 545
    Points
    3 545
    Par défaut
    Citation Envoyé par Rakken Voir le message
    Et puis après, les roues des autres ne sont pas forcement tout a fait ronde. J'ai vu cité PDO juste au dessus par exemple.
    Quelqu'un a déjà essayé d'utiliser pdo avec oracle ? Personnellement, ca a été la seule fois de ma vie ou j'ai réussi à faire un "segmentation fault" (erreur bien connue des codeurs en C) en php.
    Et si on veut utiliser des CLOB, alors là, c'est le drame absolu... Mais voila, l'appli de base était faite pour mysql, alors le choix de pdo mysql a été tout a fait interessant, avec l'optique "et en plus, ca va marcher tout seul sous oracle, ou presque).
    Un truc maison, on aurait pu l'adapter là... ben il a fallut faire avec, et les clob sont devenu des blobs, avec toutes les stupidités d'implémentation que ca entraine...
    Vive les roues de tracteur quand on veut rouler sur une piste cyclable...
    Je suis d'accord là-aussi, mais si vous utilisez Oracle je doute fort que nous soyons dans un cadre de petit développement. Je me trompe ?
    • Avant de poser une question, n'hésitez pas à chercher dans la FAQ et les forums
    • Merci d'utiliser les balises de code (# dans l'éditeur)
    • N'oubliez pas de vous servir des boutons , et

    S.N.A.F.U

  16. #16
    Membre expérimenté

    Homme Profil pro
    Inscrit en
    Janvier 2004
    Messages
    1 249
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Secteur : Finance

    Informations forums :
    Inscription : Janvier 2004
    Messages : 1 249
    Points : 1 565
    Points
    1 565
    Par défaut
    Comme prévu, voila une p'tite classe que j'ai fait y a quelques mois.

    Il y a quelques restrictions toutefois :
    * développée pour php 5
    * ne transforme que les variables venant d'un tableau super global, donc pas une variable locale qu'on aurait définie dans le script... faudrait la modifier un peu pour ca ;o)

    Le code est assez gros mais il doit y avoir 50% de commentaires

    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
    91
    92
    93
    94
    95
    96
    97
    98
    99
    100
    101
    102
    103
    104
    105
    106
    107
    108
    109
    110
    111
    112
    113
    114
    115
    116
    117
    118
    119
    120
    121
    122
    123
    124
    125
    126
    127
    128
    129
    130
    131
    132
    133
    134
    135
    136
    137
    138
    139
    140
    141
    142
    143
    144
    145
    146
    147
    148
    149
    150
    151
    152
    <?php
    /**
    * @description
    		Gestion des variables pour scripts PHP
    		Fonctionnalités :
    		- Echappement automatique de l'antislash ajouté par magic_quotes_gpc si activé
    		- Sources gérées en entrée : GET, POST, COOKIE, FILES
    		- Destinations gérées en sortie : SQL, HTML, RAW
    		- Formatage de la variable selon le type de sortie
    		- gestion des variables tableau (array)
    		- Cache des variables pour optimisation
    
    		Utilisation : 
    		$Input = new In();
    		echo $Input->G->RAW->id; // affiche $_GET['id'] sans modification
    		echo $Input->P->HTML->truc; // affiche $_POST['truc'] pour une utilisation dans une balise html (htmlentities)
    		echo $Input->C->SQL->login; // affiche $_COOKIE['login'] pour une utilisation dans une requete sql (mysql_real_escape_string)
    		echo $Input->F->RAW->nomFichier; // affiche $FILES['nomFichier']; sans modification
    * @author	Fladnag
    * @date		2007/12/29
    */
    class In {
    	/**
    		PUBLIC
    	**/
     
    	// les variables suivantes sont des instances de In également, mais elles contiennent plus d'informations.
    	// L'instance principale contient les 4 instances suivantes, une pour chaque tableau super global.
    	// Chaque instance de tableau contient ensuite 3 instances correspondant aux variables d'apres, 
    	// une pour chaque mode de sortie autorisé.
    	public $G;	// pour $_GET
    	public $P;	// pour $_POST
    	public $C;	// pour $_COOKIE
    	public $F;	// pour $_FILES
     
    	// instances de In qui n'existent que dans les instances definies au dessus.
    	public $RAW;	// donnee brute : stripslashes si magic_quotes_gpc
    	public $HTML;	// pour affichage dans une balise html
    	public $SQL;	// pour utilisation dans une requete SQL
     
    	/**
    		PRIVATE
    	**/
    	private $content;				// contient le tableau super global de l'instance
    	private $isMagicQuotesGPC;		// indique si l'option magic_quotes_gpc est activee dans php.ini
    	private $nomTableau;			// le nom du tableau super global de l'instance
    	private $nomFunction = NULL;	// le nom de la fonction locale a appliquer pour mettre en forme une variable de l'instance
    	private $cache=array();			// cache de variable pour ne pas calculer 2 fois la fonction de mise en forme
     
    	/**
    	* @description	Le constructeur doit etre appelé sans parametre. Il s'auto appelle ensuite 
    	*				avec plusieurs parametres pour construire l'arborescence d'objets necessaire
    	* @author		Fladnag
    	* @date			2007/12/29
    	* @param		$tab					Le nom du tableau super global
    	* @param		$magic_quotes_gpc		TRUE si cette option est activee dans php
    	* @param		$nomFunction			le nom de la fonction interne a utiliser pour formater une variable simple
    	*/
    	public function __construct($tab=NULL, $magic_quotes_gpc=FALSE, $nomFunction=NULL) {
    		if ($tab===NULL) {
    			$magic_quotes_gpc=(get_magic_quotes_gpc()==1);
    			$this->G = new In('_GET', $magic_quotes_gpc);
    			$this->P = new In('_POST', $magic_quotes_gpc);
    			$this->C = new In('_COOKIE', $magic_quotes_gpc);
    			$this->F = new In('_FILES', $magic_quotes_gpc);
    		} elseif ($nomFunction === NULL) {
    			$this->SQL = new In($tab, $magic_quotes_gpc, 'formatSQL');
    			$this->RAW = new In($tab, $magic_quotes_gpc, 'formatRAW');
    			$this->HTML = new In($tab, $magic_quotes_gpc, 'formatHTML');
    		} else {
    			$this->nomTableau = $tab;
    			global $$tab;
    			$this->content=$$tab;
    			$this->isMagicQuotesGPC = $magic_quotes_gpc;
    			$this->nomFunction=$nomFunction;
    		}
    	}
     
    	/**
    	* @description	Permet l'acces a une variable par son nom sans le connaitre a l'avance.
    	* @author		Fladnag
    	* @date			2007/12/29
    	*/
    	public function __get($var) {
    		$key=$this->nomFunction.'/'.$var;
    		if (!isset($this->cache[$key])) {
    			if (!isset($this->content[$var])) {
    				echo('La variable ['.$var.'] n\'est pas definie dans le tableau $'.$this->nomTableau);
    				exit;
    			}
    			$this->cache[$key] = $this->format($this->content[$var]);
    		}
    		return $this->cache[$key];
    	}
     
    	/**
    		PRIVATE
    	**/
     
    	/**
    	* @description	Formate une chaine en tenant compte de l'option magic_quotes_gpc et retourne la chaine "brute"
    	* @author		Fladnag
    	* @date			2007/12/29
    	*/
    	private function formatRAW ($var) {
    		if ($this->isMagicQuotesGPC) {
    			$var=stripslashes($var);
    		}
    		return $var;
    	}
     
    	/**
    	* @description	Formate une chaine pour une utilisation dans une balise html
    	* @author		Fladnag
    	* @date			2007/12/29
    	*/
    	private function formatHTML($var) {
    		return htmlentities($this->formatRAW($var));
    	}
     
    	/**
    	* @description	Formate une chaine pour une utilisation dans une requete SQL
    	* @author		Fladnag
    	* @date			2007/12/29
    	*/
    	private function formatSQL($var) {
    		return @mysql_real_escape_string($this->formatRAW($var));
    	}
     
    	/**
    	* @description	Formate une variable tel que determine dans l'instance actuelle.
    	* @author		Fladnag
    	* @date			2007/12/29
    	*/
    	private function format(&$var) {
    		if (is_scalar($var)) {
    			$var = $this->{$this->nomFunction}($var);
    		} elseif (is_array($var)) {
    			array_walk($var, array($this, 'format'));
    		}
    		return $var;
    	}
    }
     
    //Tests :
    //mysql_connect('localhost', 'root', '');
    //$In=new In();
    //var_dump($In->G->HTML->id);
    //var_dump($In->G->RAW->truc);
    //var_dump($In->G->SQL->truc);
     
    ?>

Discussions similaires

  1. protéger une chaine de caratère en SHELL
    Par lemahdois dans le forum Linux
    Réponses: 4
    Dernier message: 06/09/2009, 14h02
  2. Réponses: 2
    Dernier message: 03/07/2009, 14h35
  3. Fonction pour une chaine numérique
    Par miya dans le forum VB.NET
    Réponses: 5
    Dernier message: 10/05/2007, 14h21
  4. Réponses: 3
    Dernier message: 23/04/2007, 09h57
  5. random en fonction d'une chaine de caractere
    Par tatayoyo dans le forum C
    Réponses: 6
    Dernier message: 28/02/2006, 21h23

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