{"id":1753,"date":"2015-08-19T00:00:00","date_gmt":"2015-08-19T00:00:00","guid":{"rendered":"http:\/\/v32019.vaadata.com\/blog?p=1753"},"modified":"2020-12-23T11:57:02","modified_gmt":"2020-12-23T10:57:02","slug":"proteger-votre-site-bonnes-pratiques-de-securite-pour-php-2","status":"publish","type":"post","link":"https:\/\/www.vaadata.com\/blog\/fr\/proteger-votre-site-bonnes-pratiques-de-securite-pour-php-2\/","title":{"rendered":"Prot\u00e9ger votre site : Bonnes pratiques de s\u00e9curit\u00e9 pour PHP #2"},"content":{"rendered":"\n<p><em>Mis \u00e0 jour : 23 D\u00e9c 2020<\/em><\/p>\n\n\n\n<p>Cet article ne remplace pas de bonnes connaissances en <strong>PHP<\/strong>, mais peut vous donner de r\u00e9els bons conseils pour booster votre s\u00e9curit\u00e9.<br>Il n\u2019y aura ici rien \u00e0 copier\/coller directement dans vos fichiers PHP. Cependant, nous croyons que ces conseils et bonnes pratiques vous apporteront des b\u00e9n\u00e9fices \u00e0 long terme, en comprenant et en appliquant les diff\u00e9rents points en fonction de vos besoins et de votre contexte.<\/p>\n\n\n\n<p>Cet article est le deuxi\u00e8me de notre s\u00e9rie d\u00e9di\u00e9e \u00e0 la s\u00e9curit\u00e9 pour PHP. Le premier article \u201c<a href=\"https:\/\/www.vaadata.com\/blog\/fr\/bonnes-pratiques-de-securite-pour-php-partie-1-proteger-votre-site\/\" target=\"_blank\" rel=\"noreferrer noopener\">Prot\u00e9ger votre site : Bonnes pratiques de s\u00e9curit\u00e9 pour PHP #1<\/a>\u201d vous donne des indications pour la configuration de PHP, les mises \u00e0 jour, l\u2019organisation du code ainsi que le filtrage\/\u00e9chappement des donn\u00e9e<strong>s<\/strong>.<\/p>\n\n\n\n<p>Nous allons \u00e0 pr\u00e9sent examiner <strong>les attaques les plus courantes<\/strong>, ainsi que les moyens de s&rsquo;en d\u00e9fendre<strong>.<\/strong><\/p>\n\n\n\n<!--more-->\n\n\n\n\n\n<div class=\"wp-block-image\"><figure class=\"alignright\"><img decoding=\"async\" src=\"https:\/\/www.vaadata.com\/blog\/wp-content\/uploads\/2015\/08\/stop-attacks.jpg\" alt=\"Arr\u00eater les attaques\" class=\"wp-image-625\"\/><\/figure><\/div>\n\n\n\n<h2 class=\"wp-block-heading\">Injections SQL<\/h2>\n\n\n\n<p>Les injections SQL sont vraiment d\u00e9vastatrices, mais peuvent \u00eatre \u00e9vit\u00e9es en suivant quelques \u00e9tapes simples.<\/p>\n\n\n\n<p>Premi\u00e8rement, assurez-vous que les privil\u00e8ges utilisateurs dans la base de donn\u00e9es sont limit\u00e9s (principe de moindre privil\u00e8ge). Par exemple, les actions r\u00e9alis\u00e9es par un utilisateur front-office dans la base de donn\u00e9es devraient \u00eatre ex\u00e9cut\u00e9es par un utilisateur n\u2019ayant des droits que sur les tables li\u00e9es aux fonctionnalit\u00e9s front-end. S\u2019il n\u2019y a pas besoin de supprimer les donn\u00e9es d\u2019une table sp\u00e9cifique, alors ne donnez pas les droits de suppression \u00e0 cet utilisateur sur cette table.<\/p>\n\n\n\n<p>Ensuite, filtrez et nettoyez les donn\u00e9es servant d\u2019entr\u00e9e aux instructions SQL (vous pouvez vous r\u00e9f\u00e9rer \u00e0 la section <a href=\"https:\/\/www.vaadata.com\/blog\/fr\/bonnes-pratiques-de-securite-pour-php-partie-1-proteger-votre-site\/\" target=\"_blank\" rel=\"noopener noreferrer\">filtrage et \u00e9chappement des donn\u00e9es de notre premier article<\/a>).<br>Un moyen plus efficace pour se prot\u00e9ger des injections SQL (mais ne rempla\u00e7ant pas le filtrage des donn\u00e9es) est l\u2019utilisation des \u201cprepared statements\u201d (requ\u00eates param\u00e9tr\u00e9es).<br>Pour voir comment impl\u00e9menter les requ\u00eates param\u00e9tr\u00e9es : <a href=\"http:\/\/php.net\/manual\/fr\/pdo.prepared-statements.php\" target=\"_blank\" rel=\"noopener noreferrer\">http:\/\/php.net\/manual\/fr\/pdo.prepared-statements.php<\/a><\/p>\n\n\n\n\n\n<h2 class=\"wp-block-heading\">Injections de commandes<\/h2>\n\n\n\n<p>Utiliser des ex\u00e9cutions de commandes via votre code PHP est tr\u00e8s puissant, mais aussi tr\u00e8s dangereux si les pr\u00e9cautions n\u00e9cessaires ne sont pas prises.<br>Il est donc recommand\u00e9 de d\u00e9sactiver les fonctions dangereuses avec la directive disable_functions (dans le fichier php.ini).<br>De plus, une fois d\u00e9sactiv\u00e9es, ces fonctions ne pourront pas \u00eatre utilis\u00e9es par un pirate cr\u00e9ant son propre code PHP via une potentielle autre faille.<\/p>\n\n\n\n<p>disable_functions = show_source, exec, shell_exec, system, passthru, proc_open, popen, curl_exec, curl_multi_exec, parse_ini_file, show_source<\/p>\n\n\n\n<p>Lors de l\u2019utilisation de ces fonctions (si vous en avez absolument besoin), faites tr\u00e8s attention aux param\u00e8tres pass\u00e9s en entr\u00e9e. Vous devez vous assurer que les donn\u00e9es sont strictement valid\u00e9es avec des listes blanches, et\/ou filtr\u00e9es.<br>Les commandes dans leur globalit\u00e9 ainsi que les arguments peuvent \u00eatre \u00e9chapp\u00e9s via les fonctions natives escapeshellcmd (<a href=\"http:\/\/php.net\/manual\/fr\/function.escapeshellcmd.php\" target=\"_blank\" rel=\"noopener noreferrer\">http:\/\/php.net\/manual\/fr\/function.escapeshellcmd.php<\/a>) et escapeshellarg (<a href=\"http:\/\/php.net\/manual\/fr\/function.escapeshellarg.php\" target=\"_blank\" rel=\"noopener noreferrer\">http:\/\/php.net\/manual\/fr\/function.escapeshellarg.php<\/a>).<\/p>\n\n\n\n\n\n<h2 class=\"wp-block-heading\">Vols de sessions<\/h2>\n\n\n\n<p>Les sessions reposent sur des identifiants de session.<br>Une attaque fr\u00e9quente est la fixation de session, consistant \u00e0 donner un identifiant de session \u00e0 une victime avant que celle-ci ne s\u2019identifie sur l\u2019application, puis \u00e0 utiliser ce m\u00eame identifiant de session afin de r\u00e9cup\u00e9rer la session de la victime.<\/p>\n\n\n\n<p>Pour \u00e9viter de tels probl\u00e8mes, quelques r\u00e8gles doivent \u00eatre suivies :<\/p>\n\n\n\n<ul class=\"wp-block-list\"><li>ne pas accepter d\u2019identifiant de session en provenance des URL ou des requ\u00eates POST (directive session.use_only_cookies dans php.ini).<\/li><li>prot\u00e9ger les cookies de session avec les flags HttpOnly et Secure (param\u00e8tres session.cookie_secure et session.cookie_httponly dans php.ini)<\/li><li>donner une meilleure entropie aux identifiants de session, en param\u00e9trant : session.entropy_file = \/dev\/urandom dans php.ini, sur les syst\u00e8mes Linux.<\/li><\/ul>\n\n\n\n<p>Un point important est \u00e9galement de r\u00e9g\u00e9n\u00e9rer les identifiants de sessions \u00e0 un moment critique : quand les utilisateurs se connectent.<br>Vous pouvez d\u00e9clencher un renouvellement d\u2019identifiants de session en appelant la fonction session_regenerate_id (<a href=\"http:\/\/php.net\/manual\/fr\/function.session-regenerate-id.php\" target=\"_blank\" rel=\"noopener noreferrer\">http:\/\/php.net\/manual\/fr\/function.session-regenerate-id.php<\/a>).<\/p>\n\n\n\n<p>Des \u00e9l\u00e9ments compl\u00e9mentaires peuvent \u00eatre impl\u00e9ment\u00e9s pour ajouter de la s\u00e9curit\u00e9 \u00e0 diff\u00e9rents niveaux (d\u00e9fense en profondeur) :<\/p>\n\n\n\n<ul class=\"wp-block-list\"><li>garder une trace des derni\u00e8res activit\u00e9s de l\u2019utilisateur dans sa session, afin de d\u00e9tecter des activit\u00e9s suspectes sur des fonctions critiques.<\/li><li>conserver le \u201cuser agent\u201d dans la session et la v\u00e9rifier \u00e0 des moments cl\u00e9s.<\/li><li>v\u00e9rifier l\u2019adresse IP n\u2019est pas recommand\u00e9, \u00e9tant donn\u00e9 qu\u2019elle peut changer dynamiquement, par exemple sur les r\u00e9seaux mobiles.<\/li><\/ul>\n\n\n\n\n\n<h2 class=\"wp-block-heading\">XSS<\/h2>\n\n\n\n<p>Prot\u00e9ger votre site contre les attaques XSS est assez simple, vous devez appliquer le principe <a href=\"https:\/\/www.vaadata.com\/blog\/fr\/bonnes-pratiques-de-securite-pour-php-partie-1-proteger-votre-site\/\" target=\"_blank\" rel=\"noopener noreferrer\">\u201cfilter on input, escape on output\u201d (voir notre article pr\u00e9c\u00e9dent)<\/a>.<br>Mais n\u2019oubliez pas d\u2019appliquer ces v\u00e9rifications sur tous les param\u00e8tres, y compris les param\u00e8tres cach\u00e9s, les param\u00e8tres GET\/POST, cookies et headers HTTP.<\/p>\n\n\n\n<p>Une protection compl\u00e9mentaire peut \u00eatre mise en place gr\u00e2ce aux HTTP headers. Celle-ci a \u00e9t\u00e9 d\u00e9taill\u00e9e dans notre article <a href=\"https:\/\/www.vaadata.com\/blog\/fr\/securiser-votre-site-web-avec-les-headers-http\/\" target=\"_blank\" rel=\"noreferrer noopener\">\u201cS\u00e9curisez votre site web avec les headers HTTP\u201d<\/a>.<\/p>\n\n\n\n\n\n<h2 class=\"wp-block-heading\">Modification des param\u00e8tres<\/h2>\n\n\n\n<p>De nombreuses attaques s\u2019appuient sur le fait que les URL et les formulaires peuvent \u00eatre manipul\u00e9s.<br>Attendez-vous \u00e0 l\u2019inattendu, et validez les param\u00e8tres avec des filtres et des listes blanches.<\/p>\n\n\n\n\n\n<p>Le troisi\u00e8me article de notre s\u00e9rie sur les <a href=\"https:\/\/www.vaadata.com\/blog\/fr\/proteger-votre-site-bonnes-pratiques-de-securite-pour-php-3\/\" target=\"_blank\" rel=\"noreferrer noopener\">bonnes pratiques de s\u00e9curit\u00e9 pour PHP<\/a> traite des risques li\u00e9s aux cookies, uploads, CRSF ainsi que de la s\u00e9curit\u00e9 par l\u2019obscurit\u00e9.<\/p>\n","protected":false},"excerpt":{"rendered":"<p>Mis \u00e0 jour : 23 D\u00e9c 2020 Cet article ne remplace pas de bonnes connaissances en PHP, mais peut vous donner de r\u00e9els bons conseils pour booster votre s\u00e9curit\u00e9.Il n\u2019y aura ici rien \u00e0 copier\/coller directement dans vos fichiers PHP. Cependant, nous croyons que ces conseils et bonnes pratiques vous apporteront des b\u00e9n\u00e9fices \u00e0 long<\/p>\n","protected":false},"author":2,"featured_media":0,"comment_status":"closed","ping_status":"closed","sticky":false,"template":"","format":"standard","meta":{"footnotes":""},"categories":[14],"tags":[],"class_list":{"0":"post-1753","1":"post","2":"type-post","3":"status-publish","4":"format-standard","6":"category-technique"},"aioseo_notices":[],"_links":{"self":[{"href":"https:\/\/www.vaadata.com\/blog\/fr\/wp-json\/wp\/v2\/posts\/1753","targetHints":{"allow":["GET"]}}],"collection":[{"href":"https:\/\/www.vaadata.com\/blog\/fr\/wp-json\/wp\/v2\/posts"}],"about":[{"href":"https:\/\/www.vaadata.com\/blog\/fr\/wp-json\/wp\/v2\/types\/post"}],"author":[{"embeddable":true,"href":"https:\/\/www.vaadata.com\/blog\/fr\/wp-json\/wp\/v2\/users\/2"}],"replies":[{"embeddable":true,"href":"https:\/\/www.vaadata.com\/blog\/fr\/wp-json\/wp\/v2\/comments?post=1753"}],"version-history":[{"count":6,"href":"https:\/\/www.vaadata.com\/blog\/fr\/wp-json\/wp\/v2\/posts\/1753\/revisions"}],"predecessor-version":[{"id":3410,"href":"https:\/\/www.vaadata.com\/blog\/fr\/wp-json\/wp\/v2\/posts\/1753\/revisions\/3410"}],"wp:attachment":[{"href":"https:\/\/www.vaadata.com\/blog\/fr\/wp-json\/wp\/v2\/media?parent=1753"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/www.vaadata.com\/blog\/fr\/wp-json\/wp\/v2\/categories?post=1753"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/www.vaadata.com\/blog\/fr\/wp-json\/wp\/v2\/tags?post=1753"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}