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

PHP & Base de données Discussion :

Sécuriser un champ de formulaire [MySQL]


Sujet :

PHP & Base de données

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre éclairé Avatar de legrandse
    Homme Profil pro
    Responsable de service informatique
    Inscrit en
    Décembre 2010
    Messages
    354
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Belgique

    Informations professionnelles :
    Activité : Responsable de service informatique

    Informations forums :
    Inscription : Décembre 2010
    Messages : 354
    Par défaut Sécuriser un champ de formulaire
    Bonjour à tous,

    Je suis mis à mal par un robot hacker qui arrive à effacer certains champs de ma table malgré des précautions prises mais visiblement inefficaces.

    L'exemple concret:

    Lorsque l'on veut mettre à jour les données d'un article, il faut encoder une référence (ex: $newid) dans un champ de formulaire et le script affiche ensuite les infos détaillées cet article.

    Mais là ou la faille se situe c'est lorsque l'article est préenregistré mais n'a pas encore reçu de référence.

    Dans ce cas le robot arrive à lister les données qui ne contiennent pas encore de référence et à updater les champs en les remplissant par des données vides.

    Ce que je ne comprend pas, c'est que si je teste la méthode et que je laisse le code barre vide et que je valide, j'ai bien une erreur bloquante pour la suite.

    Qu'en pensez-vous ?


    Voici le formulaire en question:


    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
    <?php
    session_start();
     
    ?>
    <html>
    <head>
    </head>
    <body>
    <?php
    include("data.php");
    include("connexion.php");
     
    $time = date("Y-m-d ");
    $time2 = date("U");
     
    // On commence par récupérer les champs
    if(isset($_POST['nom']))      $nom= mysql_real_escape_string ($_POST['nom']);
    else      $nom="";
     
    if(isset($_POST['description']))      $description=mysql_real_escape_string ($_POST['description']);
    else      $description="";
     
    if(isset($_POST['dimension']))      $dimension=mysql_real_escape_string ($_POST['dimension']);
    else      $dimension="";
     
    if(isset($_POST['poids']))      $poids=mysql_real_escape_string ($_POST['poids']);
    else      $poids="";
     
     
     
    if(isset($_POST['newid']))      $newid=mysql_real_escape_string ($_POST['newid']);
    else      $newid="";
     
    i
     
    if (get_magic_quotes_gpc())
    {
    $nom=stripslashes($nom);
    $description=stripslashes($description);
    $dimension=stripslashes($dimension);
    $poids=stripslashes($poids);
    $newid=stripslashes($newid);
     
    }
     
     
     
    $sql="SELECT newid FROM gghf_table WHERE newid= '$newid'";
    $result=mysql_query($sql);
    $count=mysql_num_rows($result);
    $data = mysql_fetch_assoc($result);
     
     
    if($count !=1){
    echo 'Erreur, veuillez svp contacter le responsable'; 
    }
     
    else {
    	$_SESSION['id'] = $newid;
    echo '<SCRIPT LANGUAGE="JavaScript">
         document.location.href="modifadd.php"
    </SCRIPT>';
     
    }
     
    ?> 
     
     
    </body>
    </html>

  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
    Montre nous a quoi ressemble ton script de mise à jour plutôt.

    Tu peux activer les logs mysql pour voir ce que fait le contrevenant exactement.
    N'oubliez pas de consulter les FAQ PHP et les cours et tutoriels PHP

  3. #3
    Membre éclairé Avatar de legrandse
    Homme Profil pro
    Responsable de service informatique
    Inscrit en
    Décembre 2010
    Messages
    354
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Belgique

    Informations professionnelles :
    Activité : Responsable de service informatique

    Informations forums :
    Inscription : Décembre 2010
    Messages : 354
    Par défaut
    Voici le script de récupération des données:


    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
    <?php
    session_start();
    header('Content-type: text/html; charset=iso-8859-1');
     
     
    include("data.php");
    include("connexion.php");
     
    $newid = $_SESSION['id'];
    $sql = "SELECT * from gghf_table where newid = '$newid' " ;
    // on envoie la requête
    $req = mysql_query($sql) or die('Erreur SQL !<br>'.$sql.'<br>'.mysql_error()); 
     
    // on fait une boucle qui va faire un tour pour chaque enregistrement
     
     
    while($data = mysql_fetch_assoc($req))
        {
       ?>
       <form name="formulaire" method="post" action="modifaddconnect.php">
     
                <table >
                <tr>
    	    	<td align="right" style="width:150px ; font-size:10px"><b>Code barre article : </b></td>
    	    	<td> <input type="text" align="left" style="width:200px" id="newid" name="newid" value="<?php echo $data['newid']?>"></td>
    	        </tr> 
     
     
                <tr>
    	       	<td align="right" style="width:150px ; font-size:10px">Nom : </td>
    	       	<td> <input type="text" align="left" style="width:200px; text-transform: uppercase" name="nom" value="<?php echo $data['nom']?>" /></td>
                </tr>
     
                <tr>
    	        <td align="right" style="width:150px ; font-size:10px">Description :</td>
    	        <td> <input type="text" align="left" style="width:200px; text-transform:capitalize"name="Description" value="<?php echo $data['description']?>"/></td>
    	        </tr>
     
                <tr>
    	        <td  align="right" style="width:150px ; font-size:10px" >Dimension : </td>
    	        <td> <input type="text" align="left" style="width:200px; text-transform: uppercase" name="dimension" value="<?php echo $data['dimension']?>"/></td>
    	        </tr>
     
                <tr>
    	        <td align="right" style="width:150px ; font-size:10px" nowrap="nowrap">Poids : </td>
    	        <td> <input type="text" align="left" style="width:200px; text-transform:uppercase" name="poids" value="<?php echo $data['poids']?>"/></td>
    	        </tr>
     
     
     
     
      <?php
    	}
    	?>
     
     
     
    <tr>
    <td align="center">
    <input type="submit" value="Valider les données" style="height:50px; width:138px"/></form>
    </td>
    </tr>
     
    </table>

    Et le script de traitement de ces données:

    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
    <?php
     
    include("data.php");
    include("connexion.php");
    setlocale(LC_TIME, 'fr_BE.UTF-8');
    $time = date("Y-m-d H:i:s");
     
    // On commence par récupérer les champs
    if(isset($_POST['nom']))      $nom=mysql_real_escape_string ($_POST['nom']);
    else      $nom="";
     
    if(isset($_POST['description']))      $description=mysql_real_escape_string ($_POST['description']);
    else      $description="";
     
    if(isset($_POST['dimension']))      $dimension=mysql_real_escape_string ($_POST['dimension']);
    else      $dimension="";
     
    if(isset($_POST['poids']))      $poids=mysql_real_escape_string ($_POST['poids']);
    else      $poids="";
     
     
    if(isset($_POST['newid']))      $newid=mysql_real_escape_string ($_POST['newid']);
    else      $newid="";
     
    if (get_magic_quotes_gpc())
    {
    $nom=stripslashes($nom);
    $description=stripslashes($description);
    $dimension=stripslashes($dimension);
    $poids=stripslashes($poids);
    $newid=stripslashes($newid);
     
    }
     
     
     
    $sql="SELECT newid FROM gghf_table WHERE newid= '$newid'";
    $result=mysql_query($sql);
    $count=mysql_num_rows($result);
    $data = mysql_fetch_assoc($result);
     
     
    if($count !=1){
    include ("error.php");
    }
     
    else {
     
     
    $sql = "UPDATE gghf_table SET nom = '$nom', description= '$description', dimension = '$dimension', poids = '$poids', time= '$time' WHERE newid = '$newid'  ";    
     
     mysql_query($sql) or die('Erreur SQL !'.$sql.'<br>'.mysql_error());
    	include ("succes.php");
     
     
     
    }
     
    ?> 
     
     
    </body>
    </html>

    Et le log mysql :


    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    use `test`; UPDATE gghf_table SET nom = '', description= '', dimension = '', poids = '', time= '2014-11-02 11:52:24' WHERE newid = ''

  4. #4
    Membre Expert

    Homme Profil pro
    Développeur Web
    Inscrit en
    Mai 2011
    Messages
    1 723
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Loire Atlantique (Pays de la Loire)

    Informations professionnelles :
    Activité : Développeur Web
    Secteur : High Tech - Multimédia et Internet

    Informations forums :
    Inscription : Mai 2011
    Messages : 1 723
    Par défaut
    Il est très très très très très facile de manipuler les variables POST et (encore plus) GET envoyées dans un formulaire.

    Donc pars du principe que tes variables POST peuvent contenir absolument n'importe quoi.

    Il vaut mieux filtrer dans le sens "ça, c'est une valeur autorisée" que "ça, c'est une valeur interdite" (c'est ce que tu fais).

    Reviens vers nous si tu ne vois pas comment y parvenir.

    Au passage, l'utilisation des requêtes préparées (qui implique le changement de librairie de "mysql" vers "mysqli" ou PDO), règlerai une partie de tes problèmes (dont celui-ci, même si ça n'empêche que ce que je t'ai dit avant resterai toujours valable).

  5. #5
    Membre éclairé Avatar de legrandse
    Homme Profil pro
    Responsable de service informatique
    Inscrit en
    Décembre 2010
    Messages
    354
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Belgique

    Informations professionnelles :
    Activité : Responsable de service informatique

    Informations forums :
    Inscription : Décembre 2010
    Messages : 354
    Par défaut
    Et si dans le traitement des données je rajoute ceci:


    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    if($count !=1 && $newid == '' ){
    include ("error.php");
    }
    C'est mieux ou inutile ?

    Pour PDO, il faut que je prenne mes renseignements car je ne connais pas bien.

  6. #6
    Membre Expert

    Homme Profil pro
    Développeur Web
    Inscrit en
    Mai 2011
    Messages
    1 723
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Loire Atlantique (Pays de la Loire)

    Informations professionnelles :
    Activité : Développeur Web
    Secteur : High Tech - Multimédia et Internet

    Informations forums :
    Inscription : Mai 2011
    Messages : 1 723
    Par défaut
    C'est mieux, c'est pas inutile mais c'est toujours insuffisant.

    Relis ma suggestion :
    Il vaut mieux filtrer dans le sens "ça, c'est une valeur autorisée" que "ça, c'est une valeur interdite" (c'est ce que tu fais actuellement).

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

Discussions similaires

  1. Tester si un champ de formulaire est vide
    Par pekka77 dans le forum ASP
    Réponses: 3
    Dernier message: 28/06/2005, 16h18
  2. Champ de formulaire "file"
    Par tom06440 dans le forum Balisage (X)HTML et validation W3C
    Réponses: 4
    Dernier message: 26/05/2005, 13h56
  3. [Word] Création d'un champs de formulaire
    Par Oberown dans le forum Word
    Réponses: 2
    Dernier message: 18/04/2005, 11h10
  4. Réponses: 2
    Dernier message: 28/10/2004, 16h54
  5. Probleme avec les champs du formulaire
    Par Red_devils dans le forum Balisage (X)HTML et validation W3C
    Réponses: 8
    Dernier message: 29/09/2004, 13h06

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