24/11/2017 La sécurité des formulaires PHP – Blog de benji1000 https://www.benj
24/11/2017 La sécurité des formulaires PHP – Blog de benji1000 https://www.benji1000.net/la-securite-des-formulaires-php/ 1/6 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 24/11/2017 La sécurité des formulaires PHP – Blog de benji1000 https://www.benji1000.net/la-securite-des-formulaires-php/ 2/6 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. Afchage 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) : 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) <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> ? 24/11/2017 La sécurité des formulaires PHP – Blog de benji1000 https://www.benji1000.net/la-securite-des-formulaires-php/ 3/6 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” RÉPONDRE (HTTPS://WWW.BENJI1000.NET/LA-SECURITE-DES-FORMULAIRES-PHP/?REPLYTOCOM=23414#RESPOND) 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=23419#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=4069#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) 24/11/2017 La sécurité des formulaires PHP – Blog de benji1000 https://www.benji1000.net/la-securite-des-formulaires-php/ 4/6 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/) LAISSER UN COMMENTAIRE Votre adresse de messagerie ne sera pas publiée. Commentaire Nom Adresse de messagerie Site web LAISSER UN COMMENTAIRE RÉPONDRE (HTTPS://WWW.BENJI1000.NET/LA-SECURITE-DES-FORMULAIRES-PHP/?REPLYTOCOM=4104#RESPOND) 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) À 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 ! 24/11/2017 La sécurité des formulaires PHP – Blog de benji1000 https://www.benji1000.net/la-securite-des-formulaires-php/ 5/6 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 (https://twitter.com/b3nji1000) (http://bandcamp.com/benji1000) ARTICLES POPULAIRES 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 24/11/2017 La sécurité des formulaires PHP – uploads/S4/ la-securite-des-formulaires-php-blog-de-benji1000.pdf
Documents similaires










-
37
-
0
-
0
Licence et utilisation
Gratuit pour un usage personnel Attribution requise- Détails
- Publié le Aoû 10, 2022
- Catégorie Law / Droit
- Langue French
- Taille du fichier 0.7339MB