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

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  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 : 39
    Localisation : France, Loiret (Centre)

    Informations professionnelles :
    Activité : Consultant PHP

    Informations forums :
    Inscription : Mars 2003
    Messages : 597
    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

  2. #2
    Membre éprouvé
    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
    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);
    ?

  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 : 39
    Localisation : France, Loiret (Centre)

    Informations professionnelles :
    Activité : Consultant PHP

    Informations forums :
    Inscription : Mars 2003
    Messages : 597
    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.

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

    Informations forums :
    Inscription : Janvier 2007
    Messages : 42
    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 : 39
    Localisation : France, Loiret (Centre)

    Informations professionnelles :
    Activité : Consultant PHP

    Informations forums :
    Inscription : Mars 2003
    Messages : 597
    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

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

    Informations professionnelles :
    Activité : Développeur Web

    Informations forums :
    Inscription : Mars 2008
    Messages : 1 895
    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 éprouvé
    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
    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é.

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