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

Sécurité Discussion :

Injection de code indésirable dans les formulaires


Sujet :

Sécurité

  1. #1
    Candidat au Club
    Femme Profil pro
    Étudiant
    Inscrit en
    Août 2016
    Messages
    3
    Détails du profil
    Informations personnelles :
    Sexe : Femme
    Localisation : France, Savoie (Rhône Alpes)

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Août 2016
    Messages : 3
    Points : 2
    Points
    2
    Par défaut Injection de code indésirable dans les formulaires
    Bonjour,

    Je viens vous demander de l'aide pour identifier une attaque sur mon site et si possible réparer ma faille de sécurité.

    Je suis débutante venant d'obtenir mon titre de concepteur/développeur informatique à l'issu d'une formation professionnelle très axées sur l'ago et le code mais qui ne couvre pas les domaines de la sécurité.

    Je cherche à créer un site web php mysql avec Apache en auto-hébergement sur une Debian. Le but est de compléter ma formation qui était essentiellement axées sur dot.net et de coder en attentant que ma recherche d'emploi aboutisse.

    Le symptôme

    Lorsque mon site est en accès sur le web via mon nom de domaine, du texte qui ne vient pas de mon code pré-remplit certains champs de mes formulaires. Le même texte dans tous, formulaire d'inscription, d'identification, et de modification du profile des utilisateurs...

    Dès que je replace mon code en local sous un virtualhost de test, le symptôme disparaît : mes formulaires ont de nouveau l'apparence et le contenu que j'ai codé.

    Ma tentative de résolution

    J'ai pensé qu'il s'agit d'une faille xss.
    J'ai donc tenté de suivre les conseils donnés par http://www.developpez.net au post suivant : http://php.developpez.com/faq/?page=...rite-failleXSS


    Morceaux de code

    Peut-être ai-je mal placé la fonction suivante ?


    Code php : Sélectionner tout - Visualiser dans une fenêtre à part
    htmlentities($string, ENT_QUOTES);

    • Fichier ManagerPagesMembre.class.php

      Code php : 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
      153
      154
      155
      156
      157
      158
      159
      160
      161
      162
      163
      164
      165
      166
      167
      168
      169
      170
      171
      172
      173
      174
      175
      176
      177
      178
      179
      180
      181
      182
      183
      184
      185
      186
      187
      188
      189
      190
      191
      192
      193
      194
      195
      196
      197
      198
      199
      200
      201
      202
      203
      204
      205
      206
      207
      208
      209
      210
      211
      212
      213
      214
      215
      216
      217
      218
      219
      220
      221
      222
      223
      224
       
      <?php
      error_reporting(E_ALL);
      ini_set('display_errors', '1');
      require('../../managers/ManagerMembre.class.php');
      require('Validations.class.php');
       
      class ManagerPagesMembre
      {
          private $managerMembre;
       
          public function __construct()
          {
              $this->managerMembre = new ManagerMembre();
          }
       
          /////////////////////////////////////  Pour la page inscription.php ///////////////////////////////
       
          private function test_input($data) {
          $data = trim($data);
          $data = stripslashes($data);
          $data = htmlspecialchars($data,  ENT_QUOTES);
          return $data;
          }
       
          // avant soumission du formulaire pour conserver les informations saisies qui sont valides :
          private function remplirChampsInscript($pseudo, $prenom, $nom, $mail, $motPasse, $confirm)
          {
              $p1 = $this->test_input($pseudo);
              $p2 = $this->test_input($prenom);
              $p3 = $this->test_input($nom);
              $p4 = $this->test_input($mail);
              $p5 = $this->test_input($motPasse);
              $p6 = $this->test_input($confirm);
                      $infos = array (
                              'pseudo' => $p1,
                              'prenom' => $p2,
                              'nom' => $p3,
                              'mail' => $p4,
                              'motPasse' => $p5,
                              'confirm' => $p6
                          );
                          return $infos;
           }
       
       
          public function afficherAvantInscription()
          {
              if ($_SERVER["REQUEST_METHOD"] != "POST")
              {
                  $pseudo = $prenom = $nom = $mail = $motPasse = $confirm = "";
                  $infos = $this->remplirChampsInscript($pseudo, $prenom, $nom, $mail, $motPasse, $confirm);
                  return $infos;
              }    
          }
       
          // valider le formulaire :
          private function nombreProblemeExist($pseudo, $nom, $prenom)
          {
              $managerMembre = new ManagerMembre();
              $nb = $managerMembre->pbExistanceInfos($pseudo, $nom, $prenom);
              return $nb;
          }
          private function messageErreurSaisieExistInscript($pseudo, $nom, $prenom)
          {
              $managerMembre = new ManagerMembre();
              $managerMembre->messageExistanceInfos($pseudo, $nom, $prenom);
          }
          private function nombreProblemeSaisieInscript($password, $confirm, $pseudo, $nom, $prenom, $mail)
          {
              $validation = new Validations();
              $validation->pbMotPasse($password, 6, 15);
              $validation->pbMotPasse($confirm, 6, 15);
              $validation->pbDeuxChainesDiff($password, $confirm);
              $validation->pbChaine($nom, 2, 20);
              $validation->pbChaine($prenom, 2, 15);
              $validation->pbMail($mail);
       
              $var = $validation->getErreur();
              return $var;
          }
          private function messageErreurSaisieInscript($password, $confirm, $pseudo, $nom, $prenom, $mail)
          {  
              $validation = new Validations();
       
              $validation->invalidMotPasse($password, " mot de passe", 6, 15);
              $validation->invalidMotPasse($confirm, " mot de passe de confirmation", 6, 15);
              $validation->deuxChainesDifferentes($password, $confirm, "Le mot de passe et sa confirmation ");
              $validation->invalidChaine($nom, " nom ", 2, 20);
              $validation->invalidChaine($prenom, " prénom ", 2, 15);
              $validation->invalidMail($mail, " mail ");
          }
       
          // remplirChampsInscript($pseudo, $prenom, $nom, $mail, $motPasse, $confirm)
          public function infosAinscrire()
          {
              // les valeurs du formulaire :
                  $pseudoPost = $this->test_input(trim($_POST['pseudo']));
                  $passwordPost = $this->test_input(trim($_POST['pass'])); 
                  $confirmPost = $this->test_input(trim($_POST['confirm']));
                  $nomPost = $this->test_input(trim($_POST['nom']));
                  $prenomPost = $this->test_input(trim($_POST['prenom']));
                  $mailPost = $this->test_input(trim($_POST['mail']));
       
       
                  $infos = $this->remplirChampsInscript($pseudoPost, $prenomPost, $nomPost, 
                                                        $mailPost, $passwordPost, $confirmPost);
                  return $infos;
          }
       
          // faire l'inscription :
          public function verifierEtinscrire()
          {
              $infos = $this->infosAinscrire();
              // On compte les erreurs :
              $erreurSaisie = $this->nombreProblemeSaisieInscript($infos['motPasse'], $infos['confirm'], $infos['pseudo'], 
                                                                  $infos['nom'], $infos['prenom'], $infos['mail']);
              $erreurSaisieExist = $this->nombreProblemeExist($infos['pseudo'], $infos['nom'], $infos['prenom']);
              $totalErreur = $erreurSaisie + $erreurSaisieExist;
       
              if($totalErreur > 0)  
              {
                  $this->messageErreurSaisieInscript($infos['motPasse'], $infos['confirm'], $infos['pseudo'], 
                                                     $infos['nom'], $infos['prenom'], $infos['mail']);
       
                  $this->messageErreurSaisieExistInscript($infos['pseudo'], $infos['nom'], $infos['prenom']);
                  echo "<p style='color:purple;'>Veuillez corriger...</p>";
              }
              else
              {
                  // On hashe le mot de passe avec la fonction php 
                  // "password_hash($motDePasseAencrypter,PASSWORD_BCRYPT,['cost' => 9])" :
                  $passwordHash = password_hash($infos['motPasse'], PASSWORD_BCRYPT,['cost' => 9]);
       
                  // on enregistre le nouveau mot de passe encrypté :
                  $managerMembre = new ManagerMembre();
                  $this->managerMembre->insertMembreSimple($infos['pseudo'],$passwordHash,$infos['mail'],
                                                           $infos['nom'],$infos['prenom']);
                  // on envoie un mail de confirmation :
                  $this->envoyerMailConfirmation($infos['pseudo'], $infos['mail'], 
                                                 $infos['prenom'], $infos['nom'], $infos['motPasse']);
       
                  echo "<p>Un mail de confirmation vous a été envoyé à l'adresse : ".$infos['mail']."</p>";
                  // puis on retourne sur l'index et on sort du script pour ne pas voir le html d'inscription
                  //header('Location:../index.php');
                  exit();     
              }        
          }
       
         // mail de validation
       
          private function envoyerMailConfirmation($pseudo, $destinataire, $prenom, $nom, $motpasse)
          {
              $cle = md5(microtime(TRUE)*100000);
       
              // Préparation du mail contenant le lien d'activation
              $sujet = "Activer votre compte" ;
              $entete = "From: inscription@essai.local" ;
              $message = 'Bienvenue '.$prenom. ' '.$nom.',
      
              Votre pseudonyme est '.$pseudo.'.
      
              
              Pour activer votre compte, veuillez cliquer sur le lien ci dessous
              ou copier/coller dans votre navigateur internet.
              
              http://hypathie.net/public/pages/activation.php?log='urlencode($pseudo)'
              
              
              ---------------
              Ceci est un mail automatique, Merci de ne pas y répondre.';
       
              mail($destinataire, $sujet, $message, $entete) ; // Envoi du mail
              //echo "mail envoyé !";
             // echo "<p>Le destinataire : ".$destinataire."</p>";
              $this->managerMembre->insererCle($pseudo, $cle);
          }
       
          private function obtenirCle($pseudo)
          {
              $cle = $this->managerMembre->obtenirCle($pseudo);
              return $cle;
          }
       
          private function devientActif($pseudo)
          {
              $this->managerMembre->devientActif($pseudo);
          }
       
          private function deactiverCompte($pseudo)
          {
              $this->managerMembre->deactiverCompte($pseudo);
          }
          private function estActif($pseudo)
          {
              $var = $this->managerMembre->estActif($pseudo);
              return $var;
          }
       
          public function verifierEtActiver()
          {
              // Récupération des variables nécessaires à l'activation
              $pseudo = $_GET['log'];
              $cle = $_GET['cle'];
       
              // Récupération des informations relatives à l'activation d'un compte dans la base de données
              $estActif = $this->managerMembre->estActif($pseudo);
              $cleBdd = $this->managerMembre->obtenirCle($pseudo);
       
              if($estActif)
              {
                  echo "<h2>Votre compte est déjà actif !</h2>";
                  echo "<p><a href=../../index.php>Retour à l'index</a></p>";
              }
              else
              {
                  if($cle == $cleBdd)
                  {
                      echo "Votre compte a bien été activé !";
                      $this->devientActif($pseudo);
                      echo "<p><a href=../../index.php>Retour à l'index</a></p>";
                  }
              }
          }
    • fichier inscription.php

      Code php : 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
       
       
      <?php
          error_reporting(E_ALL);
          ini_set('display_errors', '1');
          require '../../outils/ManagerPagesMembre.class.php';
       
       ?>
       
      <!DOCTYPE html>
      <html>
          <head>
              <meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
              <title>formulaire d'inscription</title>
              <link rel="stylesheet" href="../../style/masterPage.css">
              <link rel="stylesheet" href="../../style/formulaire.css">
          </head>
          <body>
       
              <div class="header">
                  <?php include("../includes/headerPages.php"); ?>
              </div>
              <div class="body">
       
                  <div class="validation">
                      <?php
                          $managerPageMembre = new ManagerPagesMembre();
                          $infos = $managerPageMembre->afficherAvantInscription();
                          if ($_SERVER["REQUEST_METHOD"] == "POST" && !empty($_POST))
                          {
                              $infos = $managerPageMembre->infosAinscrire();
                              $managerPageMembre->verifierEtinscrire();
                          }
                      ?>
                  </div>
       
       
                  <div class="formulaire">
                      <!--<form action="inscription.php" method="post">-->
                      <form method="post" action="<?php echo htmlspecialchars($_SERVER["PHP_SELF"]);?>">
       
                      <fieldset>
                                      <legend>S'inscrire : </legend>
                          <p><span class="error">* Champs obligatoires</span></p>
                          <label >Nom</label>
                          </br>
                          <input type="text" name="nom" value="<?php echo $infos['nom'] ?>">
                          <span class="error">*</span><br />
                          <label >Prénom</label>
                          </br>
                          <input type="text" name="prenom" value="<?php echo $infos['prenom'] ?>">
                          <span class="error">*</span><br />
                          <label >Email</label>
                          </br>
                          <input type="text" name="mail" value="<?php echo $infos['mail'] ?>">
                          <span class="error">*</span><br />
                          <label >Pseudo</label>
                          </br>
                          <input type="text" name="pseudo" value="<?php echo $infos['pseudo'] ?>">
                          <span class="error">*</span><br />
                          <label>Mot de passe</label>
                          </br>
                          <input type="password" name="pass"  value="<?php echo $infos['motPasse'] ?>">
                          <span class="error">*</span><br />
                          <label>Confirmation </label>
                          </br>
                          <input type="password" name="confirm" placeholder="confirmer le mot de passe" 
                                 value="<?php echo $infos['confirm'] ?>">
                          <span class="error">*</span><br />
                          <input type="submit" value="Envoyer" 
                          <?php '<script type="text/javascript">location.reload();</script>' ?> 
                          />           
                      </fieldset>
                      </form>
                  </div>
              </div>
          </body>
      </html>



    Est-ce une mauvaise pratique en php de factoriser dans un fichier à part les fonctions utiles à la pages du formulaire ?

    Est-ce possible que le problème vienne du paramétrage de php.ini ?


    Je vous remercie d'avance pour votre attention et vos réponses, à bientôt

  2. #2
    Expert éminent sénior
    Avatar de mathieu
    Profil pro
    Inscrit en
    Juin 2003
    Messages
    10 235
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juin 2003
    Messages : 10 235
    Points : 15 532
    Points
    15 532
    Par défaut
    Citation Envoyé par nathdb Voir le message
    Le même texte dans tous, formulaire d'inscription, d'identification, et de modification du profile des utilisateurs...
    quel est ce texte ? est-ce un texte que vous avez saisi à un autre moment dans un autre champ ou un autre formulaire ?

  3. #3
    Candidat au Club
    Femme Profil pro
    Étudiant
    Inscrit en
    Août 2016
    Messages
    3
    Détails du profil
    Informations personnelles :
    Sexe : Femme
    Localisation : France, Savoie (Rhône Alpes)

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Août 2016
    Messages : 3
    Points : 2
    Points
    2
    Par défaut
    Citation Envoyé par mathieu Voir le message
    quel est ce texte ?
    Pour être plus claire :

    Voilà le formulaire tel que je l'ai codé et qui reste ainsi quand je code et teste en local :




    Voilà le formulaire quand je déplace tout le dossier de mon site pour le déployé sur le virtualhost lié à mon nom de domaine, sans que j'ai touché à rien dans mon code :



    Il se passe la même chose pour tous les autres formulaires.

    Citation Envoyé par mathieu Voir le message
    est-ce un texte que vous avez saisi à un autre moment dans un autre champ ou un autre formulaire ?
    Non ce n'est pas un texte que j'ai saisi lors d'un test de mon formulaire d'inscription ni d'autres formulaires.

    Merci de votre retour.

  4. #4
    Expert éminent sénior
    Avatar de mathieu
    Profil pro
    Inscrit en
    Juin 2003
    Messages
    10 235
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juin 2003
    Messages : 10 235
    Points : 15 532
    Points
    15 532
    Par défaut
    c'est peut-être un auto-remplissage de votre navigateur. essayez avec un autre navigateur et éventuellement sur un autre ordinateur

  5. #5
    Candidat au Club
    Femme Profil pro
    Étudiant
    Inscrit en
    Août 2016
    Messages
    3
    Détails du profil
    Informations personnelles :
    Sexe : Femme
    Localisation : France, Savoie (Rhône Alpes)

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Août 2016
    Messages : 3
    Points : 2
    Points
    2
    Par défaut
    Bonjour,

    Le problème apparaissait avec le navigateur d'un autre ordinateur... J'ai fait deux modifications.

    1) Au niveau du code

    En fait j'avais plusieurs versions du code de mon site. Et celui que je déplaçais sur le serveur exposé sur le web n'était pas exactement celui des testes en local, mais une copie d'une version antérieure. Excusez-moi pour cette erreur !

    Certains formulaires
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
                <div class="formulaire">
                    <form action="login.php" method="post">
    Alors qu'en local tous comportent :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    <form method="post" action="<?php echo htmlspecialchars($_SERVER["PHP_SELF"]);?>">
    le manager

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
        private function test_input($data) {
        $data = trim($data);
        $data = stripslashes($data);
        $data = htmlspecialchars($data);
        return $data;
        }
    Alors qu'en local :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
        private function test_input($data) {
        $data = trim($data);
        $data = stripslashes($data);
        $data = htmlspecialchars($data, ENT_QUOTES);
        return $data;
        }

    Au niveau du serveur


    La deuxième chose que j'ai faite a été de modifier les mots de passe utilisateur et root, du serveur.

    Pour plus de sécurité, j'ai alors aussi modifié, côté serveur web la configuration de openssh-server en éditant le fichier :

    Avant cela la configuration permettait la connexion ssh au serveur web avec mot de passe et nom d'utilisateur

    J'ai préféré mettre en place une connexion ssh au serveur web par clé asymétrique.

    Enfin, coté client ssh, depuis lequel je modifiais, j'ai généré une "passphrase" avec :

    Je ne sais pas laquelle de ces corrections a solutionné le problème.

    En tout cas, ça semble résolu.

    Merci pour votre soutien !

Discussions similaires

  1. Code pour ouvrir les formulaires dans la meme fenetre
    Par maxime350 dans le forum VBA Access
    Réponses: 2
    Dernier message: 13/04/2008, 16h54
  2. générateur de code dans les formulaires
    Par adel.87 dans le forum Langage
    Réponses: 4
    Dernier message: 23/02/2008, 20h43
  3. [débutant] Erreur dans les formulaires
    Par mytika dans le forum Access
    Réponses: 7
    Dernier message: 18/05/2006, 15h57
  4. [W3C] Nombre de caractère dans les formulaires
    Par oranoutan dans le forum Balisage (X)HTML et validation W3C
    Réponses: 2
    Dernier message: 12/12/2005, 01h37

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