Vous êtes sur la page 1sur 6

24/11/2017 La sécurité des formulaires PHP – Blog de benji1000

La sécurité des formulaires PHP


 28 novembre 2012 (https://www.benji1000.net/la-securite-des-formulaires-php/)  Benjamin
(https://www.benji1000.net/author/benji1000/)  Informatique (https://www.benji1000.net/category/informatique/)

Il est un domaine que l’on ne doit pas oublier lorsque l’on réalise des formulaires en PHP, c’est la sécurité. En
e et, les formulaires sont très souvent liés à une adresse mail ou à une base de données ; il est donc judicieux
de protéger ces éléments-clé d’un système d’information.

Loin d’être un guide absolu dans le domaine, cet article regroupera quelques bonnes pratiques pour
sécuriser un formulaire que j’ai glanées au l du web.

Choisir la méthode du formulaire


Le premier choix qui s’impose lors de la réalisation d’un formulaire, c’est la méthode de transmission des données d’une page à une
autre. Il en existe deux : GET, et POST. Alors que la méthode GET transmet les variables récupérées dans un formulaire par l’URL, la
méthode POST les transmet de façon masquée.

Il vous faudra donc choisir, au cas par cas, si les variables récupérées peuvent être a chées au visiteur dans l’URL, ou non. Notez que ce
n’est pas parce que les variables sont transmises en POST qu’elles sont totalement invisibles, chi rées ou sécurisées ; il reste possible de
les a cher (ou plutôt, de les intercepter) avec des outils.

Les failles XSS (Cross Site Scripting)


Pour pro ter d’une faille XSS (http://fr.wikipedia.org/wiki/Cross-site_scripting), l’attaquant va tenter d’insérer un code (JavaScript, le
plus souvent) dans un input d’un formulaire non protégé, ceci a n de modi er le fonctionnement de la page. Prenons le cas d’un
forum ; un attaquant pourrait, en exploitant une faille XSS, faire en sorte de subtiliser le cookie de connexion de chaque utilisateur qui
se connecterait à ce forum. Ou alors, rediriger tous les utilisateurs vers une page de connexion ressemblant trait pour trait à la charte
graphique du forum, mais qui en fait ne servirait qu’à récupérer leurs identi ants de connexion.

Les injections SQL


Pour exécuter une injection SQL (http://fr.wikipedia.org/wiki/Injection_SQL), l’attaquant va tenter d’insérer un code dans un input
d’un formulaire non protégé qui est relié à une base de données. Ce code peut servir à supprimer tout ou partie de la base de
données ! Mais dans le pire des cas, une injection SQL peut permettre d’outrepasser le système d’authenti cation d’un site, a n d’y
entrer sans autorisation (et voir, d’y entrer avec les privilèges de l’administrateur).

Insertion dans une base de données


Pour être sûr que des attaquants n’exécutent pas des injections SQL sur notre base de données, nous devons protéger l’insertion d’une
saisie utilisateur grâce aux fonctions :

mysql_real_escape_string() (http://php.net/manual/fr/function.mysql-real-escape-string.php) : échappe les caractères


spéciaux (notamment ‘  » et NULL) par un antislashs ; étant donné que c’est une fonction de MySQL, vous aurez besoin de vous
connecter à votre base avec un mysql_connect() avant de pouvoir l’utiliser
addslashes() (http://php.net/manual/fr/function.addslashes.php) : réalise la même chose que mysql_real_escape_string(),

mais n’est à utiliser que si vous utilisez un type de base de donnée qui ne propose pas ce genre de fonction

https://www.benji1000.net/la-securite-des-formulaires-php/ 1/6
24/11/2017 La sécurité des formulaires PHP – Blog de benji1000

Dans le cas où le site que vous développez ne requiert pas que les utilisateurs aient un jour à saisir du code informatique dans leurs
messages, on peut utiliser la fonction strip_tags() a n de purement et simplement supprimer les balises de code HTML ou Javascript
des messages des utilisateurs.

Af chage depuis une base de données (ou saisie utilisateur)


Trois fonctions s’o rent à nous pour éviter les attaques XSS. Avant de les utiliser, vous devrez vous demander si vous souhaitez que les
utilisateurs puissent stocker du code source dans votre base, ou si vous considérez que rien de ce qui n’entre dans votre base n’a besoin
d’être du code. Dans le cas d’un forum par exemple, un utilisateur peut légitimement poster un message avec du code sain (utilisez
alors l’une des deux premières fonctions).

htmlspecialchars() (http://php.net/manual/fr/function.htmlspecialchars.php) : encode les caractères < > ‘  » & pour qu’ils
soient a chés mais pas exécutés
htmlentities() (http://php.net/manual/fr/function.htmlentities.php) : la même chose que htmlspecialchars(), à la di érence
qu’elle encode beaucoup plus de caractères ; par exemple, le symbole €, les lettres accentuées é à ù…
strip_tags() (http://php.net/manual/fr/function.strip-tags.php) : supprime carrément toutes les balises contenant < et > qui
ne seront pas a chées

En n, si vous souhaitez récupérer des données qui ont été insérées en étant protégées par htmlspecialchars(), htmlentities() ou
addslashes(), il vous faudra utiliser respectivement htmlspecialchars_decode()
(http://www.php.net/manual/fr/function.htmlspecialchars-decode.php), html_entity_decode()
(http://www.php.net/manual/fr/function.html-entity-decode.php) et stripslashes()
(http://www.php.net/manual/fr/function.stripslashes.php).

Exemple concret
Pour nir, voilà un exemple d’un formulaire, avec dessous, la partie « sécurisation » (remarque : ce code sera prochainement obsolète
car PHP pousse à l’utilisation de la «  PDO  » ; voir mon commentaire (https://www.benji1000.net/la-securite-des-formulaires-
php/#comment-4104) plus bas pour un exemple d’utilisation) :

<form id="mon_formulaire" method="POST" action="formulaire.php"> ?


<input name=premier_champ type=text placeholder="Premier champ" required>
<input name=second_champ type=number placeholder="Second champ" required>
<button type=submit name=envoi>Envoi</button>

<?php
if (isset($_POST['envoi']))
{
// Connexion à la base de données
mysql_connect($dbhost, $dbuser, $dbpass);
mysql_select_db($dbname);

// Sécurisation des données reçues


$premier_champ = mysql_real_escape_string($premier_champ);
$second_champ = mysql_real_escape_string($second_champ);

// Création et envoi de la requête


$sql = 'INSERT INTO ma_table VALUES("'.$premier_champ.'","'.$second_champ.'")';
mysql_query ($sql) or die ('Erreur SQL !'.$sql.'<br />'.mysql_error());

//Clotûre de la connexion à la base de données.


mysql_close ();

// Affichage des résultats à l'utilisateur


echo 'Vous avez inséré '.htmlspecialchars($premier_champ).'.';
}
?>
</form>

Voilà donc quelques méthodes simples pour éviter que votre formulaire soit une passoire n’hésitez pas à m’indiquer dans les
commentaires si vous avez d’autres astuces pour la sécurisation simple des insertions et lectures de base de données.

(http://xkcd.com/327/)

Pour aller plus loin 


StackOver ow – How to prevent code injection attacks in PHP (EN) (http://stackover ow.com/questions/1205889/how-to-prevent-code-
injection-attacks-in-php)

https://www.benji1000.net/la-securite-des-formulaires-php/ 2/6
24/11/2017 La sécurité des formulaires PHP – Blog de benji1000

Webmaster Hub – Sécurité et formulaires PHP (http://www.webmaster-hub.com/publication/Securite-et-formulaire-PHP.html)


Apprendre PHP – Traitement des formulaires (http://www.apprendre-php.com/tutoriels/tutoriel-12-traitement-des-formulaires-avec-get-
et-post.html)
Chez Neg – Sécurité d’un formulaire PHP (http://www.chezneg.fr/leblog/chezneg-leblog.php?id_art=136)
Bastien Rossi – Les injections SQL (Bastien Rossi - Les injections SQL)
Le blog de maniT4c – Protection de formulaire contre les robots (http://www.blog.manit4c.com/2010/06/16/protection-de-formulaire-
contre-les-robots/)

Facebook (https://www.facebook.com/sharer/sharer.php?u=https://www.benji1000.net/la-securite-des-formulaires-php/)

Twitter (https://twitter.com/intent/tweet?source=webclient&original_referer=https://www.benji1000.net/la-securite-des-formulaires-
php/&text=La%20s%C3%A9curit%C3%A9%20des%20formulaires%20PHP&url=https://www.benji1000.net/la-securite-des-formulaires-
php/&related=b3nji1000&via=b3nji1000)

Google+ (https://plus.google.com/share?url=https://www.benji1000.net/la-securite-des-formulaires-php/)

Viadeo (https://www.viadeo.com/?url=https://www.benji1000.net/la-securite-des-formulaires-
php/&title=La%20s%C3%A9curit%C3%A9%20des%20formulaires%20PHP)

LinkedIn (https://www.linkedin.com/shareArticle?
mini=true&ro=true&trk=JuizSocialPostSharer&title=La%20s%C3%A9curit%C3%A9%20des%20formulaires%20PHP&url=https://www.benji1000.net/la-
securite-des-formulaires-php/)

E-mail (mailto:?subject=Visit this link nd on https://www.benji1000.net&body=Hi, I found this information for you : "La sécurité des formulaires PHP"!
This is the direct link: https://www.benji1000.net/la-securite-des-formulaires-php/ Have a nice day :))

astuces informatiques (https://www.benji1000.net/tag/astuces-informatiques/)

développement web (https://www.benji1000.net/tag/developpement-web/) php (https://www.benji1000.net/tag/php/)

sécurité (https://www.benji1000.net/tag/securite/) sécurité informatique (https://www.benji1000.net/tag/securite-informatique/)

tutoriel (https://www.benji1000.net/tag/tutoriel/)

4 réponses à “La sécurité des formulaires PHP”

ANONYME
7 janvier 2015 à 13 h 52 min (https://www.benji1000.net/la-securite-des-formulaires-php/#comment-23414)

1′ OR ‘1’=’1

RÉPONDRE (HTTPS://WWW.BENJI1000.NET/LA-SECURITE-DES-FORMULAIRES-PHP/?REPLYTOCOM=23414#RESPOND)

BENJI1000
7 janvier 2015 à 15 h 41 min (https://www.benji1000.net/la-securite-des-formulaires-php/#comment-23419)

Roh, voyons…

RÉPONDRE (HTTPS://WWW.BENJI1000.NET/LA-SECURITE-DES-FORMULAIRES-PHP/?REPLYTOCOM=23419#RESPOND)

TOMY
27 avril 2014 à 13 h 49 min (https://www.benji1000.net/la-securite-des-formulaires-php/#comment-4069)

Bonjour,
Très intéressant mais il parle d’abandonner MySQL_connect & MySQL_real_escape_string pour PDO par exemple.
Comment faire donc ?
(source doc php Avertissement Cette extension est obsolète depuis PHP 5.5.0, et sera supprimée dans le futur)

RÉPONDRE (HTTPS://WWW.BENJI1000.NET/LA-SECURITE-DES-FORMULAIRES-PHP/?REPLYTOCOM=4069#RESPOND)

https://www.benji1000.net/la-securite-des-formulaires-php/ 3/6
24/11/2017 La sécurité des formulaires PHP – Blog de benji1000

BENJI1000
27 avril 2014 à 22 h 54 min (https://www.benji1000.net/la-securite-des-formulaires-php/#comment-4104)

Je n’ai pas encore pris l’habitude d’utiliser la PDO. À ce que j’ai lu, en PDO, il faut passer par des requêtes préparées
(« prepared statements ») qui éliminent le besoin de sécuriser les variables insérées dans la requête. Petit exemple :

$pdo = new PDO(« mysql:host=localhost; dbname=mydb; charset=utf8 », « user », « password »);


$query = $pdo->prepare(« INSERT INTO test (id, nom) VALUES (:id, :nom) »);
$query->bindParam(‘id’, $_GET[‘id’], PDO::PARAM_INT);
$query->bindParam(‘nom’, $_GET[‘nom’], PDO::PARAM_STR);
$result = $query->execute():

«  Si votre application utilise exclusivement les requêtes préparées, vous pouvez être sûr qu’aucune injection SQL n’est
possible. » (vu sur la doc de PHP)

Quelques liens :
http://fr.openclassrooms.com/forum/sujet/pdo-gt-mysqlrealescapestring-19722
(http://fr.openclassrooms.com/forum/sujet/pdo-gt-mysqlrealescapestring-19722)
http://stackover ow.com/a/14012675 (http://stackover ow.com/a/14012675)
http://www.php.net/manual/fr/pdo.prepared-statements.php (http://www.php.net/manual/fr/pdo.prepared-
statements.php)
http://fr.php.net/manual/fr/class.pdo.php (http://fr.php.net/manual/fr/class.pdo.php)

RÉPONDRE (HTTPS://WWW.BENJI1000.NET/LA-SECURITE-DES-FORMULAIRES-PHP/?REPLYTOCOM=4104#RESPOND)

LAISSER UN COMMENTAIRE

Votre adresse de messagerie ne sera pas publiée.

Commentaire

Nom

Adresse de messagerie

Site web

LAISSER UN COMMENTAIRE

 Arrivera-t-on un jour à court de musique ? (https://www.benji1000.net/arrivera-t-on-un-jour-a-court-de-musique/)

Games of Thrones – Premières images de la saison 3  (https://www.benji1000.net/games-of-thrones-premieres-images-de-la-saison-3/)

À PROPOS DE CE BLOG

Je m'appelle Benjamin, ingénieur en sécurité informatique sur la région Rhône-Alpes. Retrouvez sur ce blog mes trouvailles du net, des
articles sur l'actualité, des coups de gueule, de la musique, des tutos en informatique, et en sécurité les vidéos virales du moment... 
Bon surf !

https://www.benji1000.net/la-securite-des-formulaires-php/ 4/6
24/11/2017 La sécurité des formulaires PHP – Blog de benji1000

(https://twitter.com/b3nji1000)

(http://bandcamp.com/benji1000)

ARTICLES POPULAIRES

Tutoriel pour débuter avec le Raspberry Pi (https://www.benji1000.net/tutoriel-pour-debuter-avec-le-raspberry-pi/)


30 Juin , 2012

Récupérer les données d’un disque-dur non reconnu (https://www.benji1000.net/recuperer-les-donnees-dun-disque-dur-


non-reconnu/)
25 Sep , 2012

Arnaque Ménapaiement du paiement en 3x sans frais (https://www.benji1000.net/arnaque-menapaiement-du-paiement-


en-3x-sans-frais/)
03 Fév , 2013

Le support SAV de MSI (https://www.benji1000.net/le-support-sav-de-msi/)


03 Juil , 2014

Installer un SSD mSATA dans un MSI GE60 (https://www.benji1000.net/installer-un-ssd-msata-dans-un-msi-ge60/)


26 Juil , 2013

Jouer à Ages of Empires 2 en ligne (https://www.benji1000.net/jouer-a-ages-of-empires-2-en-ligne/)


18 Fév , 2012

RASPBERRY PI

(http://www.benji1000.net/tutoriel-pour-debuter-avec-le-raspberry-pi/)

Découvrez cette fantastique carte électronique et faîtes vos premier pas !

CATÉGORIES

Fun (https://www.benji1000.net/category/fun/)

Vidéos (https://www.benji1000.net/category/videos/)

Actu (https://www.benji1000.net/category/actualite/)

Informatique (https://www.benji1000.net/category/informatique/)

SUR LES RÉSEAUX SOCIAUX


https://www.benji1000.net/la-securite-des-formulaires-php/ 5/6
24/11/2017 La sécurité des formulaires PHP – Blog de benji1000

ARTICLES POPULAIRES

Tutoriel pour débuter avec le Raspberry Pi (https://www.benji1000.net/tutoriel-pour-debuter-avec-le-raspberry-pi/)


30 Juin , 2012

Récupérer les données d’un disque-dur non reconnu (https://www.benji1000.net/recuperer-les-donnees-dun-disque-dur-non-


reconnu/)
25 Sep , 2012

Arnaque Ménapaiement du paiement en 3x sans frais (https://www.benji1000.net/arnaque-menapaiement-du-paiement-en-3x-


sans-frais/)
03 Fév , 2013

Le support SAV de MSI (https://www.benji1000.net/le-support-sav-de-msi/)


03 Juil , 2014

C’EST DIT !

Benjamin dans Réglages courants de WampServer (https://www.benji1000.net/reglages-courants-de-wampserver/#comment-51174)

Benjamin dans Comprendre le nommage des chiers vidéos de séries (https://www.benji1000.net/comprendre-le-nommage-des- chiers-videos-
de-series/#comment-51173)

Benjamin dans Le support SAV de MSI (https://www.benji1000.net/le-support-sav-de-msi/#comment-51172)

nch dans Retrouver l’espace perdu sur une carte SD (https://www.benji1000.net/retrouver-lespace-perdu-sur-une-carte-sd/#comment-51169)

Sylvie Migner dans Comprendre le nommage des chiers vidéos de séries (https://www.benji1000.net/comprendre-le-nommage-des- chiers-
videos-de-series/#comment-51157)

LIENS

Giggity Team (http://www.giggityteam.fr/)

Thème par Colorlib (http://colorlib.com/). Propulsé par WordPress (http://wordpress.org/)

https://www.benji1000.net/la-securite-des-formulaires-php/ 6/6

Vous aimerez peut-être aussi