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 :

Securité formulaire Php


Sujet :

Langage PHP

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre confirmé
    Inscrit en
    Octobre 2008
    Messages
    172
    Détails du profil
    Informations forums :
    Inscription : Octobre 2008
    Messages : 172
    Par défaut Securité formulaire Php
    Bonjour a Tous,

    Je voudrais votre avis pour la sécurité d'un formulaire (spam et injection)

    J'ai cette fonction

    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
     
    <?php
    function quote_smart($value)
    {
        if(get_magic_quotes_gpc())
        {
         $value = stripslashes($value);
        }
       $value = htmlentities($value, ENT_QUOTES, 'ISO-8859-1');
       $value = htmlspecialchars($value, ENT_QUOTES);
       $value = mysql_real_escape_string($value);
       return strip_tags($value);
    }
     
    ?>
    je recupere ma variable

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    $adresse= quote_smart(($_POST['adresse']));
    Une question a ce propos, il vaut mieux mettre quote_smart(()); ou quote_smart(); . Les deux passent; mais juste savoir lequel est le mieux.

    Pour le spam, j'utilise un champs en plus. Ceux sont des questions stockées dans un tableau, la réponse également.

  2. #2
    Modérateur
    Avatar de sabotage
    Homme Profil pro
    Inscrit en
    Juillet 2005
    Messages
    29 208
    Détails du profil
    Informations personnelles :
    Sexe : Homme

    Informations forums :
    Inscription : Juillet 2005
    Messages : 29 208
    Par défaut
    htmlentities() etant une version etendue de htmlspecialchars(), je ne vois l'interet d'utiliser les deux.

    De plus ces fonctions servent a formater des chaines de caracteres pour du HTML.
    mysql_real_escape_string() quant a elle, prepare une chaine a être inserée dans une requete SQL.

    Il y a donc confusion des genres.
    N'oubliez pas de consulter les FAQ PHP et les cours et tutoriels PHP

  3. #3
    Membre confirmé
    Inscrit en
    Octobre 2008
    Messages
    172
    Détails du profil
    Informations forums :
    Inscription : Octobre 2008
    Messages : 172
    Par défaut
    Merci, donc le mieux serait quelle fonction pour eviter l'injection ? Sachant que je veux eviter également l'envoi de html

  4. #4
    Membre éclairé Avatar de Linio
    Inscrit en
    Octobre 2005
    Messages
    431
    Détails du profil
    Informations forums :
    Inscription : Octobre 2005
    Messages : 431
    Par défaut
    Comme le précise sabotage tu vas utiliser une fonction de type html_entities pour éviter une injection HTML/PHP (donc à l'affichage de ta page), il faut t'en servir si la valeur que l'utilisateur rentre dans le formulaire est affichée sur la page.
    La fonction mysql_real_escape_string quand à elle protège des injection SQL, tu dois protéger ta variable si elle est utilisée pour être insérée dans une base de donnée.

    Tu peux utiliser les deux dans le cas où ta variable est envoyée en base de donnée en vue d'être réaffichée ensuite.

    Tu peux donc utiliser le mysql_real_escape_string pour protéger, et le html_entities à l'affichage.

  5. #5
    Membre confirmé
    Inscrit en
    Octobre 2008
    Messages
    172
    Détails du profil
    Informations forums :
    Inscription : Octobre 2008
    Messages : 172
    Par défaut
    donc un simple :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    <?php
    function quote_smart($value)
    {
        if(get_magic_quotes_gpc())
        {
         $value = stripslashes($value);
        }
        $value = preg_replace( '/\\\\/u', '\\\\\\\\', $value); 
        $value = mysql_real_escape_string($value); 
        $value = preg_replace( '/([%_])/u', '\\\\$1', $value); 
       return $value;
    }
     
    ?>
    devrait suffir ?

    Et lors de l'affichage :

    echo htmlspecialchars($var);

  6. #6
    FoxLeRenard
    Invité(e)
    Par défaut
    Citation Envoyé par epoc.01 Voir le message
    Bonjour a Tous,
    Je voudrais votre avis pour la sécurité d'un formulaire
    return strip_tags($value);
    Je partages les réponses données, mais j'ajouterais quelques remarques.

    htmlspecialchars est effectivement une fonction moins systématique que htmlentities, Mais bien suffisante pour la sécuritée et elle est moins destructive pour l' aspect du texte .

    Tu utilises dans cette fonction mysql_real_escape_string
    cela supposes que tu va injecter dans une base MYSQL ou autre et que cette base est OUVERTE (connectée) au moment de l'appel de la fonction

    Tu termines par strip_tags() qui ne valide actuellement pas le HTML, les balises partielles ou rompues peuvent conduire à la suppression de plus de textes/données que désiré. vraiment pourquoi faire ça alors que tu aura fait htmlspecialchars

    Enfin je te rappelles deux points qui me tiennent a coeur,
    Quand nous avons assimilé cela, nous pouvons le systématiser partout !

    Mais gardons a l'esprit que
    si nous voulons ecrire un texte $texte dans un fichier alors il faut ne pas oublier le bon vieux addslashes

    Enfin le fin du fin,

    mysql_real_escape_string() n'échappe ni %, ni _ ni `

    On nous dit
    "Si magic_quotes_gpc est activée, appliquez d'abord la fonction stripslashes"
    Vraiment ça coute rien de le faire d'office !

    Je reviens a ` il reste dangeureux donc un str_replace en \`

    Bon cette fois on doit avoir tout parcouru

    HOULA ... oui mais si ce que tout le monde dit sur
    mysql_real_escape_string est bien compris ...
    pas que en ecriture mais surtout en interogation si non Mot de passe =""

  7. #7
    Modérateur
    Avatar de sabotage
    Homme Profil pro
    Inscrit en
    Juillet 2005
    Messages
    29 208
    Détails du profil
    Informations personnelles :
    Sexe : Homme

    Informations forums :
    Inscription : Juillet 2005
    Messages : 29 208
    Par défaut
    mysql_real_escape_string() n'échappe ni %, ni _ ni `
    Tu aurais un exemple d'injection exploitant un de ces caractères ?
    N'oubliez pas de consulter les FAQ PHP et les cours et tutoriels PHP

  8. #8
    FoxLeRenard
    Invité(e)
    Par défaut
    Oui, tu sais qu'n généarl, (nous en avion parlé) j'évites ...
    Mais bon je vais t'appeler a l'aide

    Je me fais un PHP classique MYSQL ou je simules mes POST ...

    Tu testes ce PHP en l'adaptant a une de tes bases
    Puis tu le retestes en mettant la protection (retirer les /* */

    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
     
     
    <?php
     $Serveur = "localhost"; $User = "root"; $Mdp =  ""; $MaBase = "mysql";
     
     $username = 'FoxLeRenard';
     $password = "'  OR ''='";
     
     $link=mysql_connect($Serveur,$User,$Mdp)  OR die('Erreur connexion ');
     $Flag2=mysql_select_db($MaBase) OR die('Erreur connexion ');
    /*   $username=mysql_real_escape_string($username, $link);
     $password=mysql_real_escape_string($password, $link); */
     $query ="select * from  fi_user WHERE  UserNom = '$username'  AND UserPas = '$password' ";
     echo ("".$query."<br />");
     $result=mysql_query($query, $link);
          while ($row=mysql_fetch_array($result)) 
             {
              $UserNom= stripslashes($row['UserNom']);
              $UserMail= stripslashes($row['UserMail']);
              $UserPas= stripslashes($row['UserPas']);
              echo ("xxxxxxx".$UserMail."xxxxx<br />");
              }
       mysql_close();
     
    ?>
    </body></html>
    Bon ça c 'est facile mais j'ais vu de mes yeux vu, trafiquer le même
    genre avec la protection `
    Pas de chance, impossible de retrouver cela ! pffff
    mais testes quand même tu verras que même avec la protection l'affichage n'est pas idiot ... désolé

    c' était un truc de ce genre là Aray=Aray

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
     
     
     $password = "` OR `$_POST`=`$_POST";

Discussions similaires

  1. Réponses: 11
    Dernier message: 28/10/2005, 10h21
  2. [Sécurité] Modification php.ini -> memory_limit
    Par Elianora la blanche dans le forum Langage
    Réponses: 4
    Dernier message: 12/10/2005, 21h38
  3. [Sécurité] Session PHP
    Par lemagicien dans le forum Langage
    Réponses: 8
    Dernier message: 06/10/2005, 17h09
  4. [MySQL] Formulaire php + bdd = perte des sauts de ligne html ?
    Par sunshine33 dans le forum PHP & Base de données
    Réponses: 8
    Dernier message: 03/10/2005, 12h19
  5. [Sécurité] fichier php.ini
    Par iomega dans le forum Langage
    Réponses: 2
    Dernier message: 28/09/2005, 16h27

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