YOUPASS - convertir le crédit téléphonique en monnaie ! : Partenaire RealityGaming.fr

Tutoriel SĂ©curisez vos formulaires - PHP

Walky đŸ»

DĂ©veloppeur
DĂ©veloppeur
Inscrit
18 Octobre 2012
Messages
1 250
J'aime
1 137
Points
6 570
Reply from Walky đŸ» Forums gĂ©nĂ©raux Informatique ⌚ Programmation Programmation web : SĂ©curisez vos formulaires - PHP #1
SĂ©curisez vos formulaires - PHP Programmation web  Programmation web
Bonjour à tous , aujourd'hui nous allons, ensemble, apprendre à sécuriser nos formulaires HTML.

SĂ©curisez vos formulaires - PHP Programmation web  Programmation web
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 .

SĂ©curisez vos formulaires - PHP Programmation web  Programmation web
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();
}
SĂ©curisez vos formulaires - PHP Programmation web  Programmation web
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>
SĂ©curisez vos formulaires - PHP Programmation web  Programmation web
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 joints

Louis ☄

Membre Premium
Premium
Inscrit
8 Juin 2013
Messages
5 289
J'aime
5 144
Points
9 137
Reply from Louis ☄ Forums gĂ©nĂ©raux Informatique ⌚ Programmation Programmation web : SĂ©curisez vos formulaires - PHP #2
Voir la piĂšce jointe 101360
Bonjour à tous , aujourd'hui nous allons, ensemble, apprendre à sécuriser nos formulaires HTML.

Voir la piĂšce jointe 101356
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 .

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();
}
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>
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
Yeah, beau topic Walky ! ::):
 

Djamel SEC

Ancien staff
Ancien staff
Inscrit
24 Août 2012
Messages
19 515
J'aime
9 755
Points
15 630
Reply from Djamel SEC Forums gĂ©nĂ©raux Informatique ⌚ Programmation Programmation web : SĂ©curisez vos formulaires - PHP #3
Énorme Walky !
 

Ichigo' SEC

Community Manager
Modérateur
Inscrit
24 Septembre 2011
Messages
6 613
J'aime
3 777
Points
7 790
Reply from Ichigo' SEC Forums gĂ©nĂ©raux Informatique ⌚ Programmation Programmation web : SĂ©curisez vos formulaires - PHP #4
Voir la piĂšce jointe 101360
Bonjour à tous , aujourd'hui nous allons, ensemble, apprendre à sécuriser nos formulaires HTML.

Voir la piĂšce jointe 101356
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 .

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();
}
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>
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
Lourd ! :panic:
 

Espi0n

Membre Premium
Premium
Inscrit
27 Août 2015
Messages
2 361
J'aime
1 102
Points
3 471
Reply from Espi0n Forums gĂ©nĂ©raux Informatique ⌚ Programmation Programmation web : SĂ©curisez vos formulaires - PHP #5
Pas Lourd :trollface:
 

Julien Moreau

Lobby-Man
Premium
Inscrit
5 FĂ©vrier 2013
Messages
1 742
J'aime
647
Points
5 450
Reply from Julien Moreau Forums gĂ©nĂ©raux Informatique ⌚ Programmation Programmation web : SĂ©curisez vos formulaires - PHP #6
Bon Tito merci :)
 

xRwizz

Ancien staff
Ancien staff
Inscrit
12 Juin 2013
Messages
18 297
J'aime
5 539
Points
13 538
Reply from xRwizz Forums gĂ©nĂ©raux Informatique ⌚ Programmation Programmation web : SĂ©curisez vos formulaires - PHP #7
Voir la piĂšce jointe 101360
Bonjour à tous , aujourd'hui nous allons, ensemble, apprendre à sécuriser nos formulaires HTML.

Voir la piĂšce jointe 101356
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 .

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();
}
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>
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
Du lourd, beau topic Walky ::cool::
 
Inscrit
21 Juin 2014
Messages
1 161
J'aime
379
Points
3 518
Reply from ❀cƓur Forums gĂ©nĂ©raux Informatique ⌚ Programmation Programmation web : SĂ©curisez vos formulaires - PHP #9
Voir la piĂšce jointe 101360
Bonjour à tous , aujourd'hui nous allons, ensemble, apprendre à sécuriser nos formulaires HTML.

Voir la piĂšce jointe 101356
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 .

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();
}
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>
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
Premier Developpédacteur ?
 

membre8987

Ancien staff
Ancien staff
Inscrit
22 Octobre 2011
Messages
14 104
J'aime
7 737
Points
11 735
Reply from membre8987 Forums gĂ©nĂ©raux Informatique ⌚ Programmation Programmation web : SĂ©curisez vos formulaires - PHP #11
BG Walky ! :cool:
 
M

membre150711

Invité
Reply from membre150711 Forums gĂ©nĂ©raux Informatique ⌚ Programmation Programmation web : SĂ©curisez vos formulaires - PHP #12
Ça me fait penser au trophĂ©e Mario :pensif:
 

Insomniaque97

Donateur
Premium
Inscrit
21 Juillet 2015
Messages
1 090
J'aime
505
Points
2 775
Reply from Insomniaque97 Forums gĂ©nĂ©raux Informatique ⌚ Programmation Programmation web : SĂ©curisez vos formulaires - PHP #13
Merci beaucoup, trÚs intéressant !
 

Rivals

Ancien dĂ©veloppeur de l’équipe
Premium
Inscrit
27 Août 2016
Messages
338
J'aime
304
Points
1 546
Reply from Rivals Forums gĂ©nĂ©raux Informatique ⌚ Programmation Programmation web : SĂ©curisez vos formulaires - PHP #14
Bonjour Walky SEC ,

Je ne veux pas ĂȘtre mĂ©chant mais ça ne sĂ©curise en rien ton formulaire Ă  l'heure d'aujourd'hui, avec
Vous devez vous inscrire pour voir les liens !
par exemple on peut trĂšs facilement spammer ton formulaire et rendre ton token inutile :p

PHP:
public $erreur = null;
Equivaut Ă  :
PHP:
public $erreur;
Et le salt doit avoir une portée limitée donc protected ;)

Presque parfait :trollface:

P.S : Tu as oublié de charger ta classe

Bonne journée,
Rivals
 

W?Y?E?

Membre
Premium
Inscrit
16 Mai 2015
Messages
5 180
J'aime
2 065
Points
6 295
Reply from W?Y?E? Forums gĂ©nĂ©raux Informatique ⌚ Programmation Programmation web : SĂ©curisez vos formulaires - PHP #15
Salut Walky SEC :membre:

J'adore <3
 

Walky đŸ»

DĂ©veloppeur
DĂ©veloppeur
Inscrit
18 Octobre 2012
Messages
1 250
J'aime
1 137
Points
6 570
Reply from Walky đŸ» Forums gĂ©nĂ©raux Informatique ⌚ Programmation Programmation web : SĂ©curisez vos formulaires - PHP #16
P.S : Tu as oublié de charger ta classe
PHP:
$class = new SubmitForm();
:d:

Je ne vois pas comment PhantomJS pourrait "bypass" le formulaire, sachant que si la clé n'est pas valide / non définie, le formulaire ne s'envoie pas (je prends le cas ou les données du formulaire seraient sauvegardées etc..)
 

Rivals

Ancien dĂ©veloppeur de l’équipe
Premium
Inscrit
27 Août 2016
Messages
338
J'aime
304
Points
1 546
Reply from Rivals Forums gĂ©nĂ©raux Informatique ⌚ Programmation Programmation web : SĂ©curisez vos formulaires - PHP #17
PHP:
$class = new SubmitForm();
:d:

Je ne vois pas comment PhantomJS pourrait "bypass" le formulaire, sachant que si la clé n'est pas valide / non définie, le formulaire ne s'envoie pas (je prends le cas ou les données du formulaire seraient sauvegardées etc..)
C'est pas ça charger, ça c'est instancier (tu dois require ton fichier) :d:

PhantomJS te permet de toucher au DOM, donc avoir accÚs à ton input caché et ainsi on peut faire des boucles :p
 

Walky đŸ»

DĂ©veloppeur
DĂ©veloppeur
Inscrit
18 Octobre 2012
Messages
1 250
J'aime
1 137
Points
6 570
Reply from Walky đŸ» Forums gĂ©nĂ©raux Informatique ⌚ Programmation Programmation web : SĂ©curisez vos formulaires - PHP #18
C'est pas ça charger, ça c'est instancier (tu dois require ton fichier) :d:
Le code HTML et PHP sont dans le mĂȘme fichier, donc pas besoin :)

PhantomJS te permet de toucher au DOM, donc avoir accÚs à ton input caché et ainsi on peut faire des boucles :p
Hum, oui je vois un peu prĂšs le fonctionnement :mmh:

Enfin bon, ça permet toujours de sécuriser un minimum ses formulaires, contrairement à un formulaire sans clé.
 

Rivals

Ancien dĂ©veloppeur de l’équipe
Premium
Inscrit
27 Août 2016
Messages
338
J'aime
304
Points
1 546
Reply from Rivals Forums gĂ©nĂ©raux Informatique ⌚ Programmation Programmation web : SĂ©curisez vos formulaires - PHP #19
Le code HTML et PHP sont dans le mĂȘme fichier, donc pas besoin :)


Hum, oui je vois un peu prĂšs le fonctionnement :mmh:

Enfin bon, ça permet toujours de sécuriser un minimum ses formulaires, contrairement à un formulaire sans clé.
Ah d'accord, je pensais que tu séparais les deux, good job :neo:
 

ian 🌊

Membre Premium
Premium
Inscrit
7 Novembre 2016
Messages
217
J'aime
68
Points
756
Reply from ian 🌊 Forums gĂ©nĂ©raux Informatique ⌚ Programmation Programmation web : SĂ©curisez vos formulaires - PHP #20
Lourd merci beaucouĂš
 


Haut