Connexion
S'inscrire
Actualités
Quoi de neuf
Activités générales
Auteurs
Forums
Nouveaux messages
Rechercher un forum
Quoi de neuf
Nouveaux messages
Nouveaux messages de profil
Activités générales
Membres
Membres inscrits
Visiteurs actuels
Nouveaux messages de profil
Rechercher dans les messages des profils
Teams
Créé ton équipe
Quoi de neuf ?
Nouveaux messages
Rechercher un forum
Menu
Connexion
S'inscrire
Install the app
Install
Forums
Forums généraux
Informatique
Développement
Sécurisez vos formulaires - PHP
JavaScript is disabled. For a better experience, please enable JavaScript in your browser before proceeding.
Vous utilisez un navigateur non à jour ou ancien. Il ne peut pas afficher ce site ou d'autres sites correctement.
Vous devez le mettre à jour ou utiliser un
navigateur alternatif
.
Répondre à la discussion
Message
<blockquote data-quote="Walky 🇫🇷" data-source="post: 6922635" data-attributes="member: 175291"><p style="text-align: center">[ATTACH=full]101360[/ATTACH] </p> <p style="text-align: center"><span style="font-family: 'Verdana'">Bonjour à tous [fa]fa-smile-o[/fa], aujourd'hui nous allons, ensemble, apprendre à <strong>sécuriser</strong> [fa]fa-lock[/fa] nos formulaires HTML.</span></p> <p style="text-align: center"><span style="font-family: 'Verdana'"></span></p> <p style="text-align: center">[ATTACH=full]101356[/ATTACH]</p><p><span style="font-family: 'Verdana'">[fa]fa-angle-right[/fa] Bien évidemment, nous n'utiliserons pas de vérification Captcha ou ReCaptcha pour ne pas embêter le visiteur.</span></p><p><span style="font-family: 'Verdana'"></span></p><p><span style="font-family: 'Verdana'">[fa]fa-angle-right[/fa] Le principe va consister à générer une <strong>clé secrète [fa]fa-key[/fa]</strong> pour l'insérer dans un champ invisible dans notre formulaire.</span></p><p><span style="font-family: 'Verdana'">Et lors de l'envoi du formulaire, nous allons vérifier la validité de la clé.</span></p><p><span style="font-family: 'Verdana'"></span></p><p><span style="font-family: 'Verdana'">[fa]fa-angle-right[/fa] Pour générer notre clé secrètre, nous utiliserons deux paramètres:</span></p><ul> <li data-xf-list-type="ul"><span style="font-family: 'Verdana'">Un <strong>salt</strong> (de préférence tapé à la main)</span></li> <li data-xf-list-type="ul"><span style="font-family: 'Verdana'">Le <strong>timestamp </strong>actuel</span></li> </ul><p><span style="font-family: 'Verdana'">[fa]fa-angle-right[/fa] Veillez à ne pas utiliser de variables statiques, voilà pourquoi j'utilise le <strong>timestamp [fa]fa-clock-o[/fa]</strong>.</span></p><p><span style="font-family: 'Verdana'"></span></p><p style="text-align: center">[ATTACH=full]101357[/ATTACH]</p><p><span style="font-family: 'Verdana'">[fa]fa-angle-right[/fa] 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 <strong>PHP [fa]fa-code[/fa]</strong> permettant de <strong>crypter les données [fa]fa-user-secret[/fa]</strong>, dans ce tutoriel je vais utiliser SHA1.</span></p><p><span style="font-family: 'Verdana'"></span></p><p><span style="font-family: 'Verdana'">[fa]fa-angle-right[/fa] Commençons donc par créer notre seul et unique fichier, qui contiendra le formulaire <strong>HTML</strong> <strong>[fa]fa-html5[/fa]</strong> ainsi que le code <strong>PHP</strong> <strong>[fa]fa-code[/fa]</strong>.</span></p><p></p><p><span style="font-family: 'Verdana'">[fa]fa-angle-right[/fa] Je tiens à vous informer que j'utiliserai la <strong>POO </strong>tout au long du tutoriel.</span></p><p><span style="font-family: 'Verdana'">[php]</span></p><p><span style="font-family: 'Verdana'"><?php</span></p><p><span style="font-family: 'Verdana'"></span></p><p><span style="font-family: 'Verdana'">class SubmitForm</span></p><p><span style="font-family: 'Verdana'">{</span></p><p><span style="font-family: 'Verdana'"> public $salt = '782hdbbab001mbdjbxaoi9'; // tapé à la main</span></p><p><span style="font-family: 'Verdana'"> public $erreur = null; // ici, sera stocké l'erreur</span></p><p><span style="font-family: 'Verdana'"></span></p><p><span style="font-family: 'Verdana'"> public function __construct()</span></p><p><span style="font-family: 'Verdana'"> {</span></p><p><span style="font-family: 'Verdana'"> session_start(); // on démarre la session</span></p><p><span style="font-family: 'Verdana'"> $_SESSION['key'] = uniqid(microtime(true)); // on stocke notre clé relative au timestamp dans une variable de session</span></p><p><span style="font-family: 'Verdana'"> }</span></p><p><span style="font-family: 'Verdana'"></span></p><p><span style="font-family: 'Verdana'"> public function buildKey()</span></p><p><span style="font-family: 'Verdana'"> {</span></p><p><span style="font-family: 'Verdana'"> if (!isset($_SESSION['key'])) // la variable de session "key" doit obligatoirement exister</span></p><p><span style="font-family: 'Verdana'"> {</span></p><p><span style="font-family: 'Verdana'"> $this->erreur = 'Une erreur s\'est produite, veuillez rafraîchir la page.';</span></p><p><span style="font-family: 'Verdana'"> return false;</span></p><p><span style="font-family: 'Verdana'"> }</span></p><p><span style="font-family: 'Verdana'"></span></p><p><span style="font-family: 'Verdana'"> $secretKey = sha1($_SESSION['key'] . $this->salt);</span></p><p><span style="font-family: 'Verdana'"> return $secretKey;</span></p><p><span style="font-family: 'Verdana'"> }</span></p><p><span style="font-family: 'Verdana'">}</span></p><p><span style="font-family: 'Verdana'">[/php]</span></p><p><span style="font-family: 'Verdana'"></span></p><p><span style="font-family: 'Verdana'">[fa]fa-angle-right[/fa] On constate donc qu'il y a une variable de class: <strong>$salt</strong>, contenant notre salt, ainsi que <strong>2 fonctions</strong>. L'une, exécutée directement lors du chargement de la page, et une autre permettant de générer la <strong>clé secrète [fa]fa-key[/fa]</strong>.</span></p><p><span style="font-family: 'Verdana'"></span></p><p><span style="font-family: 'Verdana'">[fa]fa-angle-right[/fa] À cela on va ajouter le formulaire <strong>HTML [fa]fa-html5[/fa]</strong>, de base un formulaire <strong>non sécurisé [fa]fa-chain-broken[/fa]</strong> ressemble à ceci:</span></p><p><span style="font-family: 'Verdana'">[html]</span></p><p><span style="font-family: 'Verdana'"><!DOCTYPE html></span></p><p><span style="font-family: 'Verdana'"><html></span></p><p><span style="font-family: 'Verdana'"> <head></span></p><p><span style="font-family: 'Verdana'"> <!-- Vos données --></span></p><p><span style="font-family: 'Verdana'"> </head></span></p><p><span style="font-family: 'Verdana'"> <body></span></p><p><span style="font-family: 'Verdana'"> <form method="post" action="/"></span></p><p><span style="font-family: 'Verdana'"> <input type="text" name="prenom" placeholder="Prénom..." /></span></p><p><span style="font-family: 'Verdana'"> <input type="text" name="age" placeholder="Age..." /></span></p><p><span style="font-family: 'Verdana'"></span></p><p><span style="font-family: 'Verdana'"> <input type="submit" value="Soumettre" /></span></p><p><span style="font-family: 'Verdana'"> </form></span></p><p><span style="font-family: 'Verdana'"> </body></span></p><p><span style="font-family: 'Verdana'"></html></span></p><p><span style="font-family: 'Verdana'">[/html]</span></p><p><span style="font-family: 'Verdana'"></span></p><p><span style="font-family: 'Verdana'">[fa]fa-angle-right[/fa] On va donc stocker notre <strong>clé secrète [fa]fa-key[/fa]</strong> dans une variable, générée par notre fonction créée précédemment.</span></p><p>[php]</p><p>$class = new SubmitForm();</p><p>$secretKey = $class->buildKey();</p><p>[/php]</p><p></p><p>[fa]fa-angle-right[/fa] Et <strong>l'insérer </strong>dans un champ invisible dans le formulaire<strong> HTML [fa]fa-html5[/fa]</strong></p><p>[php]</p><p><input type="hidden" name="key" value="<?= $secretKey ?>" /></p><p>[/php]</p><p></p><p>[fa]fa-angle-right[/fa] Il ne nous reste donc, seulement la vérification de la clé ! Et afficher l'erreur dans le formulaire <strong>HTML [fa]fa-html5[/fa]</strong></p><p>[php]</p><p>public function verifyKey()</p><p>{</p><p> if (!isset($_SESSION['key'])) // la variable de session "key" doit obligatoirement exister</p><p> {</p><p> $this->erreur = 'Une erreur s\'est produite, veuillez rafraîchir la page.';</p><p> return false;</p><p> }</p><p></p><p> if (!isset($_POST['key'])) // le formulaire doit contenir le champ "key"</p><p> {</p><p> $this->erreur = 'Une erreur de sécurité s\'est produite, veuillez rafraîchir la page.';</p><p> return false;</p><p> }</p><p></p><p> $secretKey = sha1($_SESSION['key'] . $this->salt);</p><p> if ($_POST['key'] != $secretKey) // la clé secrète envoyée doit correspondre exactement à celle créée par la fonction</p><p> {</p><p> $this->erreur = 'Une erreur de sécurité s\'est produite, veuillez rafraîchir la page.';</p><p> return false;</p><p> }</p><p></p><p> return true;</p><p>}</p><p>[/php]</p><p></p><p>[fa]fa-angle-right[/fa] En dehors de la <strong>class</strong>, nous avons donc quelque chose du genre</p><p>[php]</p><p>$class = new SubmitForm();</p><p>$secretKey = $class->buildKey();</p><p></p><p>if ($_SERVER['REQUEST_METHOD'] == 'post') // on vérifie la clé seulement si la requête envoyée est au format POST</p><p>{</p><p> $class->verifyKey();</p><p>}</p><p>[/php]</p><p></p><p style="text-align: center">[ATTACH=full]101358[/ATTACH]</p><p>[php]</p><p><?php</p><p></p><p>class SubmitForm</p><p>{</p><p> public $salt = '782hdbbab001mbdjbxaoi9';</p><p> public $erreur = null;</p><p></p><p> public function __construct()</p><p> {</p><p> session_start(); // on démarre la session</p><p> $_SESSION['key'] = uniqid(microtime(true)); // on stocke notre clé relative au timestamp dans une variable de session</p><p> }</p><p></p><p> public function buildKey()</p><p> {</p><p> if (!isset($_SESSION['key']))</p><p> {</p><p> $this->erreur = 'Une erreur s\'est produite, veuillez rafraîchir la page.';</p><p> return false;</p><p> }</p><p></p><p> $secretKey = sha1($_SESSION['key'] . $this->salt);</p><p> return $secretKey;</p><p> }</p><p></p><p> public function verifyKey()</p><p> {</p><p> if (!isset($_SESSION['key'])) // la variable de session "key" doit obligatoirement exister</p><p> {</p><p> $this->erreur = 'Une erreur s\'est produite, veuillez rafraîchir la page.';</p><p> return false;</p><p> }</p><p></p><p> if (!isset($_POST['key'])) // le formulaire doit contenir le champ "key"</p><p> {</p><p> $this->erreur = 'Une erreur de sécurité s\'est produite, veuillez rafraîchir la page.';</p><p> return false;</p><p> }</p><p></p><p> $secretKey = sha1($_SESSION['key'] . $this->salt);</p><p> if ($_POST['key'] != $secretKey) // la clé secrète envoyée doit correspondre exactement à celle créée par la fonction</p><p> {</p><p> $this->erreur = 'Une erreur de sécurité s\'est produite, veuillez rafraîchir la page.';</p><p> return false;</p><p> }</p><p></p><p> return true;</p><p> }</p><p>}</p><p></p><p>$class = new SubmitForm();</p><p>$secretKey = $class->buildKey();</p><p></p><p>if ($_SERVER['REQUEST_METHOD'] == 'post') // on vérifie la clé seulement si la requête envoyée est au format POST</p><p>{</p><p> $class->verifyKey();</p><p>}</p><p>?></p><p></p><p><!DOCTYPE html></p><p><html></p><p> <head></p><p> <!-- Vos données --></p><p> </head></p><p> <body></p><p> <?php</p><p> if ($class->erreur)</p><p> {</p><p> echo $class->erreur;</p><p> }</p><p> ?></p><p> <form method="post" action="/"></p><p> <input type="text" name="prenom" placeholder="Prénom..." /></p><p> <input type="text" name="age" placeholder="Age..." /></p><p></p><p> <input type="hidden" name="key" value="<?= $secretKey ?>" /></p><p> <input type="submit" value="Soumettre" /></p><p> </form></p><p> </body></p><p></html></p><p>[/php]</p><p></p><p style="text-align: center">[ATTACH=full]101359[/ATTACH]</p><p>[fa]fa-angle-right[/fa] Je vous remercie d'avoir lu ce tutoriel, et n'hésitez pas à me faire part de vos <strong>erreurs / bugs</strong> rencontrés si vous utilisez le système que je viens de vous présenter <img src="data:image/gif;base64,R0lGODlhAQABAIAAAAAAAP///yH5BAEAAAAALAAAAAABAAEAAAIBRAA7" class="smilie smilie--sprite smilie--sprite405" alt="::cool::" title="Cool ::cool::" loading="lazy" data-shortname="::cool::" /></p><p></p><p><em><span style="font-size: 12px">Merci [USER=150183]@Lawid SEC[/USER] pour les headers <img src="/data/assets/smilies/love.gif" class="smilie" loading="lazy" alt=":love:" title="Love :love:" data-shortname=":love:" /></span></em></p><p></p><p><strong><em>Walky</em></strong></p></blockquote><p></p>
[QUOTE="Walky 🇫🇷, post: 6922635, member: 175291"] [CENTER][ATTACH=full]101360[/ATTACH] [FONT=Verdana]Bonjour à tous [fa]fa-smile-o[/fa], aujourd'hui nous allons, ensemble, apprendre à [B]sécuriser[/B] [fa]fa-lock[/fa] nos formulaires HTML. [/FONT] [ATTACH=full]101356[/ATTACH][/CENTER] [FONT=Verdana][fa]fa-angle-right[/fa] Bien évidemment, nous n'utiliserons pas de vérification Captcha ou ReCaptcha pour ne pas embêter le visiteur. [fa]fa-angle-right[/fa] Le principe va consister à générer une [B]clé secrète [fa]fa-key[/fa][/B] 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é. [fa]fa-angle-right[/fa] Pour générer notre clé secrètre, nous utiliserons deux paramètres:[/FONT] [LIST] [*][FONT=Verdana]Un [B]salt[/B] (de préférence tapé à la main)[/FONT] [*][FONT=Verdana]Le [B]timestamp [/B]actuel[/FONT] [/LIST] [FONT=Verdana][fa]fa-angle-right[/fa] Veillez à ne pas utiliser de variables statiques, voilà pourquoi j'utilise le [B]timestamp [fa]fa-clock-o[/fa][/B]. [/FONT] [CENTER][ATTACH=full]101357[/ATTACH][/CENTER] [FONT=Verdana][fa]fa-angle-right[/fa] 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 [B]PHP [fa]fa-code[/fa][/B] permettant de [B]crypter les données [fa]fa-user-secret[/fa][/B], dans ce tutoriel je vais utiliser SHA1. [fa]fa-angle-right[/fa] Commençons donc par créer notre seul et unique fichier, qui contiendra le formulaire [B]HTML[/B] [B][fa]fa-html5[/fa][/B] ainsi que le code [B]PHP[/B] [B][fa]fa-code[/fa][/B].[/FONT] [FONT=Verdana][fa]fa-angle-right[/fa] Je tiens à vous informer que j'utiliserai la [B]POO [/B]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; } } [/php] [fa]fa-angle-right[/fa] On constate donc qu'il y a une variable de class: [B]$salt[/B], contenant notre salt, ainsi que [B]2 fonctions[/B]. L'une, exécutée directement lors du chargement de la page, et une autre permettant de générer la [B]clé secrète [fa]fa-key[/fa][/B]. [fa]fa-angle-right[/fa] À cela on va ajouter le formulaire [B]HTML [fa]fa-html5[/fa][/B], de base un formulaire [B]non sécurisé [fa]fa-chain-broken[/fa][/B] 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> [/html] [fa]fa-angle-right[/fa] On va donc stocker notre [B]clé secrète [fa]fa-key[/fa][/B] dans une variable, générée par notre fonction créée précédemment.[/FONT] [php] $class = new SubmitForm(); $secretKey = $class->buildKey(); [/php] [fa]fa-angle-right[/fa] Et [B]l'insérer [/B]dans un champ invisible dans le formulaire[B] HTML [fa]fa-html5[/fa][/B] [php] <input type="hidden" name="key" value="<?= $secretKey ?>" /> [/php] [fa]fa-angle-right[/fa] Il ne nous reste donc, seulement la vérification de la clé ! Et afficher l'erreur dans le formulaire [B]HTML [fa]fa-html5[/fa][/B] [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; } [/php] [fa]fa-angle-right[/fa] En dehors de la [B]class[/B], 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] [CENTER][ATTACH=full]101358[/ATTACH][/CENTER] [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> [/php] [CENTER][ATTACH=full]101359[/ATTACH][/CENTER] [fa]fa-angle-right[/fa] Je vous remercie d'avoir lu ce tutoriel, et n'hésitez pas à me faire part de vos [B]erreurs / bugs[/B] rencontrés si vous utilisez le système que je viens de vous présenter ::cool:: [I][SIZE=3]Merci [USER=150183]@Lawid SEC[/USER] pour les headers :love:[/SIZE][/I] [B][I]Walky[/I][/B] [/QUOTE]
Insérer les citations…
Vérification
Publier la réponse
Forums
Forums généraux
Informatique
Développement
Sécurisez vos formulaires - PHP
Ce site utilise des cookies. En continuant à utiliser ce site, vous acceptez l'utilisation des cookies.
Acceptez
En savoir plus.…
Haut