1. Ce site utilise des cookies. En continuant à utiliser ce site, vous acceptez l'utilisation des cookies. En savoir plus.

Tutoriel Sécurisez vos formulaires - PHP

Discussion dans 'Programmation web' créé par Walky SEC, 8 Novembre 2016.

  1. Walky SEC

    Walky SEC Développeur Développeur

    Inscrit:
    18 Octobre 2012
    Messages:
    1 221
    Appréciations:
    1 116
    Points:
    5 920
    header1.png
    Bonjour à tous , aujourd'hui nous allons, ensemble, apprendre à sécuriser nos formulaires HTML.

    header2.png
    Bien évidemment, nous n'utiliserons pas de vérification Captcha ou ReCaptcha pour ne pas embêter le visiteur.

    Le principe va consister à générer une clé secrète pour l'insérer dans un champ invisible dans notre formulaire.
    Et lors de l'envoi du formulaire, nous allons vérifier la validité de la clé.

    Pour générer notre clé secrètre, nous utiliserons deux paramètres:

    • Un salt (de préférence tapé à la main)
    • Le timestamp actuel
    Veillez à ne pas utiliser de variables statiques, voilà pourquoi j'utilise le timestamp .

    header3.png
    Comme vu dans la partie précédente, nous utiliserons deux paramètres, mais vous vous doutez bien qu'on ne les affichera pas directement dans le formulaire (même en champ masqué), on va donc utiliser une fonction PHP permettant de crypter les données , dans ce tutoriel je vais utiliser SHA1.

    Commençons donc par créer notre seul et unique fichier, qui contiendra le formulaire HTML ainsi que le code PHP .


    Je tiens à vous informer que j'utiliserai la POO tout au long du tutoriel.
    PHP:
    <?php

    class SubmitForm
    {
        public 
    $salt   '782hdbbab001mbdjbxaoi9'// tapé à la main
        
    public $erreur null// ici, sera stocké l'erreur

        
    public function __construct()
        {
            
    session_start(); // on démarre la session
            
    $_SESSION['key'] = uniqid(microtime(true)); // on stocke notre clé relative au timestamp dans une variable de session
        
    }

        public function 
    buildKey()
        {
            if (!isset(
    $_SESSION['key'])) // la variable de session "key" doit obligatoirement exister
            
    {
                
    $this->erreur 'Une erreur s\'est produite, veuillez rafraîchir la page.';
                return 
    false;
            }

            
    $secretKey sha1($_SESSION['key'] . $this->salt);
            return 
    $secretKey;
        }
    }
    On constate donc qu'il y a une variable de class: $salt, contenant notre salt, ainsi que 2 fonctions. L'une, exécutée directement lors du chargement de la page, et une autre permettant de générer la clé secrète .

    À cela on va ajouter le formulaire HTML , de base un formulaire non sécurisé ressemble à ceci:
    HTML:
    <!DOCTYPE html>
    <html>
        <head>
            <!-- Vos données -->
        </head>
        <body>
            <form method="post" action="/">
                <input type="text" name="prenom" placeholder="Prénom..." />
                <input type="text" name="age" placeholder="Age..." />
    
                <input type="submit" value="Soumettre" />
            </form>
        </body>
    </html>
    
    On va donc stocker notre clé secrète dans une variable, générée par notre fonction créée précédemment.

    PHP:
    $class     = new SubmitForm();
    $secretKey $class->buildKey();
    Et l'insérer dans un champ invisible dans le formulaire HTML
    PHP:
    <input type="hidden" name="key" value="<?= $secretKey ?>" />
    Il ne nous reste donc, seulement la vérification de la clé ! Et afficher l'erreur dans le formulaire HTML
    PHP:
    public function verifyKey()
    {
        if (!isset(
    $_SESSION['key'])) // la variable de session "key" doit obligatoirement exister
        
    {
            
    $this->erreur 'Une erreur s\'est produite, veuillez rafraîchir la page.';
            return 
    false;
        }

        if (!isset(
    $_POST['key'])) // le formulaire doit contenir le champ "key"
        
    {
            
    $this->erreur 'Une erreur de sécurité s\'est produite, veuillez rafraîchir la page.';
            return 
    false;
        }

        
    $secretKey sha1($_SESSION['key'] . $this->salt);
        if (
    $_POST['key'] != $secretKey// la clé secrète envoyée doit correspondre exactement à celle créée par la fonction
        
    {
            
    $this->erreur 'Une erreur de sécurité s\'est produite, veuillez rafraîchir la page.';
            return 
    false;
        }

        return 
    true;
    }
    En dehors de la class, nous avons donc quelque chose du genre
    PHP:
    $class     = new SubmitForm();
    $secretKey $class->buildKey();

    if (
    $_SERVER['REQUEST_METHOD'] == 'post'// on vérifie la clé seulement si la requête envoyée est au format POST
    {
        
    $class->verifyKey();
    }
    header4.png
    PHP:
    <?php

    class SubmitForm
    {
        public 
    $salt   '782hdbbab001mbdjbxaoi9';
        public 
    $erreur null;

        public function 
    __construct()
        {
            
    session_start(); // on démarre la session
            
    $_SESSION['key'] = uniqid(microtime(true)); // on stocke notre clé relative au timestamp dans une variable de session
        
    }

        public function 
    buildKey()
        {
            if (!isset(
    $_SESSION['key']))
            {
                
    $this->erreur 'Une erreur s\'est produite, veuillez rafraîchir la page.';
                return 
    false;
            }

            
    $secretKey sha1($_SESSION['key'] . $this->salt);
            return 
    $secretKey;
        }

        public function 
    verifyKey()
        {
            if (!isset(
    $_SESSION['key'])) // la variable de session "key" doit obligatoirement exister
            
    {
                
    $this->erreur 'Une erreur s\'est produite, veuillez rafraîchir la page.';
                return 
    false;
            }

            if (!isset(
    $_POST['key'])) // le formulaire doit contenir le champ "key"
            
    {
                
    $this->erreur 'Une erreur de sécurité s\'est produite, veuillez rafraîchir la page.';
                return 
    false;
            }

            
    $secretKey sha1($_SESSION['key'] . $this->salt);
            if (
    $_POST['key'] != $secretKey// la clé secrète envoyée doit correspondre exactement à celle créée par la fonction
            
    {
                
    $this->erreur 'Une erreur de sécurité s\'est produite, veuillez rafraîchir la page.';
                return 
    false;
            }

            return 
    true;
        }
    }

    $class     = new SubmitForm();
    $secretKey $class->buildKey();

    if (
    $_SERVER['REQUEST_METHOD'] == 'post'// on vérifie la clé seulement si la requête envoyée est au format POST
    {
        
    $class->verifyKey();
    }
    ?>

    <!DOCTYPE html>
    <html>
        <head>
            <!-- Vos données -->
        </head>
        <body>
            <?php
                
    if ($class->erreur)
                {
                    echo 
    $class->erreur;
                }
            
    ?>
            <form method="post" action="/">
                <input type="text" name="prenom" placeholder="Prénom..." />
                <input type="text" name="age" placeholder="Age..." />

                <input type="hidden" name="key" value="<?= $secretKey ?>" />
                <input type="submit" value="Soumettre" />
            </form>
        </body>
    </html>
    header5.png
    Je vous remercie d'avoir lu ce tutoriel, et n'hésitez pas à me faire part de vos erreurs / bugs rencontrés si vous utilisez le système que je viens de vous présenter ::cool::

    Merci @Lawid SEC pour les headers :love:

    Walky
     

    Fichiers attachés:



  2. Louki

    Louki Modérateur Modérateur

    Inscrit:
    8 Juin 2013
    Messages:
    5 266
    Appréciations:
    5 277
    Points:
    8 727
    Yeah, beau topic Walky ! ::):
     
    Walky SEC aime ça.
  3. Djamel SEC

    Djamel SEC Ancien staff Ancien staff

    Inscrit:
    24 Août 2012
    Messages:
    19 512
    Appréciations:
    10 175
    Points:
    15 630
    Énorme Walky !
     
    Walky SEC aime ça.
  4. Ichigo' SEC

    Ichigo' SEC Assistant Assistant

    Inscrit:
    24 Septembre 2011
    Messages:
    6 346
    Appréciations:
    3 436
    Points:
    7 380
    Lourd ! :panic:
     
    Walky SEC aime ça.
  5. Espi0n

    Espi0n Membre Premium Premium

    Inscrit:
    27 Août 2015
    Messages:
    2 357
    Appréciations:
    1 132
    Points:
    3 461
    Pas Lourd :trollface:
     
    Walky SEC aime ça.
  6. Julien Moreau

    Julien Moreau Lobby-Man Premium

    Inscrit:
    5 Février 2013
    Messages:
    1 651
    Appréciations:
    650
    Points:
    5 010
    Bon Tito merci :)
     
    Walky SEC aime ça.
  7. xRwizz

    xRwizz Ancien staff Ancien staff

    Inscrit:
    12 Juin 2013
    Messages:
    18 299
    Appréciations:
    5 697
    Points:
    13 538
    Du lourd, beau topic Walky ::cool::
     
    Walky SEC aime ça.
  8. ॐ Devkush ॐ

    ॐ Devkush ॐ Membre Premium Premium

    Inscrit:
    30 Octobre 2015
    Messages:
    557
    Appréciations:
    212
    Points:
    2 176
    100% Fonctionelle merci pour ce tuto ;)
     
    Walky SEC aime ça.
  9. ❤cœur

    ❤cœur Le plus beau

    Inscrit:
    21 Juin 2014
    Messages:
    1 165
    Appréciations:
    391
    Points:
    3 518
    Premier Developpédacteur ?
     
    Walky SEC aime ça.
  10. Walky SEC

    Walky SEC Développeur Développeur

    Inscrit:
    18 Octobre 2012
    Messages:
    1 221
    Appréciations:
    1 116
    Points:
    5 920
    :espion:
     
    ❤cœur aime ça.

Partager cette page

Publicité