Protection universelle contre les attaques xss et les injections sql

Il se trouve que depuis un an, je devais m'occuper de l'assistance technique pour l'hébergement, ainsi que de l'assistance pour les sites avec lesquels j'ai une relation plutôt indirecte. Et comme les administrateurs sont assez souvent confrontés à toutes sortes d'attaques sur leurs sites, sans avoir la possibilité d'engager un spécialiste, j'ai pensé à proposer une solution unique et universelle pour tous les sites qui les aiderait à protéger leur site sans trop d'effort. Et bien qu'il y ait encore beaucoup d'inconvénients et de nuances que je n'ai pas encore pu résoudre, c'est néanmoins la seule solution pour le moment qui vous permet de sécuriser le site de l'intérieur, sans avoir recours à toutes sortes de plug-ins et modules qui doivent être installés de l'extérieur et qui même développeur de site Web inexpérimenté est capable d'installer et de configurer sur son site. L'essence de cette solution est de traiter les données transmises par les méthodes GET, POST et / ou COOKIE, avant même qu'elles ne soient traitées et écrites directement dans la base de données.

Dans cet article, je donnerai des exemples de l'utilisation et des inconvénients d'une méthode particulière.

Voici le code lui-même

$jsxss="onabort,oncanplay,oncanplaythrough,ondurationchange,onemptied,onended,onerror,onloadeddata,onloadedmetadata,onloadstart,onpause,onplay,onplaying,onprogress,onratechange,onseeked,onseeking,onstalled,onsuspend,ontimeupdate,onvolumechange,onwaiting,oncopy,oncut,onpaste,ondrag,ondragend,ondragenter,ondragleave,ondragover,ondragstart,ondrop,onblur,onfocus,onfocusin,onfocusout,onchange,oninput,oninvalid,onreset,onsearch,onselect,onsubmit,onabort,onbeforeunload,onerror,onhashchange,onload,onpageshow,onpagehide,onresize,onscroll,onunload,onkeydown,onkeypress,onkeyup,altKey,ctrlKey,shiftKey,metaKey,key,keyCode,which,charCode,location,onclick,ondblclick,oncontextmenu,onmouseover,onmouseenter,onmouseout,onmouseleave,onmouseup,onmousemove,onwheel,altKey,ctrlKey,shiftKey,metaKey,button,buttons,which,clientX,clientY,detail,relatedTarget,screenX,screenY,deltaX,deltaY,deltaZ,deltaMode,animationstart,animationend,animationiteration,animationName,elapsedTime,propertyName,elapsedTime,transitionend,onerror,onmessage,onopen,ononline,onoffline,onstorage,onshow,ontoggle,onpopstate,ontouchstart,ontouchmove,ontouchend,ontouchcancel,persisted,javascript"; $jsxss = explode(",",$jsxss); foreach($_GET as $k=>$v) { if(is_array($v)) { foreach($v as $Kk=>$Vv) { $Vv = preg_replace ( "'<script[^>]*?>.*?</script>'si", "", $Vv ); $Vv = str_replace($jsxss,"",$Vv); $Vv = str_replace (array("*","\\"), "", $Vv ); $Vv = strip_tags($Vv); $Vv = htmlentities($Vv, ENT_QUOTES, "UTF-8"); $Vv = htmlspecialchars($Vv, ENT_QUOTES); $_GET[$k][$Kk] = $Vv; } } ELSE { //       xss- $v = preg_replace ( "'<script[^>]*?>.*?</script>'si", "", $v ); //   javascript     xss- $v = str_replace($jsxss,"",$v); //     SQL- $v = str_replace (array("*","\\"), "", $v ); //         SQL $v = mysql_real_escape_string( $v ); //   . $v = strip_tags($v); //      HTML- $v = htmlentities($v, ENT_QUOTES, "UTF-8"); $v = htmlspecialchars($v, ENT_QUOTES); // GET  $_GET[$k] = $v; } } 

L'exemple ci-dessus ne gère que les requêtes GET. La boucle doit donc être répétée avec au moins POST et COOKIE. Malheureusement, je n'ai pas pu exécuter cette solution de manière récursive dans la fonction, et passer tous les tableaux $ _GET, $ _POST et $ _COOKIE dont nous avions besoin en même temps. Et la chose la plus importante qui n'a pas pu être réalisée était une traversée récursive de tableaux multidimensionnels de ce type, qui est associée à la particularité du transfert de données de données à l'intérieur de la fonction, ainsi qu'à l'utilisation limitée des variables variables.

1) $ v = preg_replace ("'<script [^>] *?>. *? ' Si", "", $ v);

Ici, nous supprimons le code javascript explicitement inutile. Une fonction peut s'avérer superflue si vous vous autorisez toujours à passer directement le code lui-même, non pas pour son exécution, mais pour la familiarisation. Par exemple sur les forums.

2) $ v = str_replace ($ jsxss, "", $ v);

La fonction est similaire à la première, mais dans ce cas, nous supprimons les événements pouvant être utilisés pour les attaques xss. Vous pouvez légèrement modifier cette solution et supprimer non seulement l'événement lui-même, mais aussi le contenu qu'ils tentent d'y attacher. Mais je n'en ai pas encore vu le besoin

3) $ v = str_replace (tableau ("*", "\\"), "", $ v);

Et ces caractères nuisibles, en particulier la barre oblique inverse, peuvent provoquer le piratage de votre SQL. Étant donné que le symbole lui-même est utilisé assez rarement et que son danger potentiel est assez élevé, j'ai décidé de le détruire dans l'œuf.

4) $ v = mysql_real_escape_string ($ v);

L'utilisation de cette fonction peut entraîner un échappement inutile de caractères, car elle est probablement déjà utilisée directement lors de l'écriture de données dans la base de données, mais d'un autre côté, elle vous aidera à vous protéger contre l'injection SQL et à protéger vos données comme aucune autre. Lorsque vous l'utilisez, vous devez utiliser la fonction après vous être connecté à la base de données. N'oublions pas non plus que mysql_real_escape_string n'est pas utilisé en php 7, et l'utilisation même de ces fonctions dépend de la méthode de connexion. Par exemple, lors de la connexion à la base de données via mysqli, vous devrez peut-être utiliser la fonction mysqli_real_escape_string.

5) $ v = strip_tags ($ v);

Strip_tags aidera à supprimer toutes les balises inutiles. Malheureusement, les nécessaires aussi. Le deuxième paramètre, vous pouvez spécifier les balises que vous souhaitez laisser. Mais le problème est qu'il y a tellement de balises nécessaires que leur liste est assez problématique, et le plus regrettable, il y a aussi des balises que les développeurs de sites ajoutent eux-mêmes pour créer certaines fonctions sur le site. Bien sûr, il serait beaucoup plus pratique de spécifier les balises à supprimer et non à laisser. Mais nous nous contenterons de ce que nous avons. De plus, des expressions régulières peuvent être utilisées pour de telles décisions.

6) $ v = htmlentities ($ v, ENT_QUOTES, "UTF-8");

7) $ v = htmlspecialchars ($ v, ENT_QUOTES);

Je pense que ces deux fonctions n'ont pas besoin d'être présentées et l'une est similaire à l'autre, il suffit donc d'en utiliser une. Néanmoins, ils sont loin d'être toujours appropriés.

Pour le moment, c'est tout ce que j'ai réussi à collecter. Si quelqu'un a quelque chose à ajouter à cet article, je serai content;)

PS Pour ceux qui veulent une solution et proposent d'utiliser PDO, des moteurs de modèles, différents modules de serveur, etc. Je ne nie en aucune façon que cette solution a ses inconvénients, et quelque part elle faussera la conclusion et pourrait même affecter la fonctionnalité, pour laquelle j'ai écrit au début de l'article que la solution a ses inconvénients.

Ce message n'est pas destiné aux programmeurs, il s'adresse aux administrateurs de site qui n'ont pas les connaissances et l'expérience nécessaires pour modifier le code de l'intérieur. Pour ceux qui ne veulent pas ou ne peuvent pas payer pour l'achèvement des sites. Ce qui arrive souvent lorsqu'un développeur rend les sites Web moins chers sur certains CMS peu coûteux et souvent entièrement gratuits.

Et pour éviter que cela ne se produise, vous devez développer vos sites sur un CMS fiable et de confiance, avec un support technique de haute qualité. Le CMS le plus approprié et fonctionnel pour développer de tels projets est Bitrix. Commander chez nous sur https: // wazzup . Hébergement et licence Bitrix, nous sommes prêts à configurer et installer gratuitement la boutique.

Veuillez également noter que nous avons une offre spéciale pour l'achat d'une licence Bitrix, jusqu'à 6 mois d'hébergement gratuits.

Nos clients choisissent Bitrix, car il s'agit du seul plus grand système de gestion de site de la Fédération de Russie avec un énorme système de support technique et de puissantes fonctionnalités. La fiabilité de Bitrix est déterminée non seulement par le temps, mais aussi par le support technique qualifié constant des programmeurs, contrairement au CMS gratuit et peu coûteux, dont le développement et le support sont assurés par des passionnés en constante évolution, sans grande expérience.

Source: https://habr.com/ru/post/fr470193/


All Articles