So kam es, dass ich mich im vergangenen Jahr mit dem technischen Support für das Hosting sowie mit dem Support für Websites befassen musste, zu denen ich eine eher indirekte Beziehung habe. Und da Administratoren häufig allen Arten von Angriffen auf ihre Websites ausgesetzt sind, ohne die Möglichkeit zu haben, einen Spezialisten einzustellen, kam mir der Gedanke, eine einzige und universelle Lösung für alle Websites zu entwickeln, mit deren Hilfe sie ihre Website ohne großen Aufwand schützen können. Und obwohl es noch viele Minuspunkte und Nuancen gibt, die ich noch nicht lösen konnte, ist dies derzeit die einzige Lösung, mit der Sie die Site von innen sichern können, ohne auf alle Arten von Plug-Ins und Modulen zurückgreifen zu müssen, die von außen installiert werden müssen und die sogar Unerfahrener Website-Entwickler kann auf seiner Website installieren und konfigurieren. Das Wesentliche dieser Lösung besteht darin, die von den Methoden GET, POST und / oder COOKIE übertragenen Daten zu verarbeiten, noch bevor sie verarbeitet und direkt in die Datenbank geschrieben werden.
In diesem Artikel werde ich Beispiele für die Verwendung und die Nachteile einer bestimmten Methode geben.
Hier ist der Code selbst
$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 {
Das obige Beispiel behandelt nur GET-Anforderungen. Die Schleife muss also mindestens mit POST und COOKIE wiederholt werden. Leider konnte ich diese Lösung in der Funktion nicht rekursiv ausführen und alle benötigten Arrays $ _GET, $ _POST und $ _COOKIE gleichzeitig übergeben. Und das Wichtigste, was nicht realisiert werden konnte, war eine rekursive Durchquerung mehrdimensionaler Arrays dieses Typs, die mit der Besonderheit der Datenübertragung von Daten innerhalb der Funktion sowie der eingeschränkten Verwendung variabler Variablen verbunden ist.
1) $ v = preg_replace ("'<script [^>] *?>. *? ' Si", "", $ v);
Hier entfernen wir explizit unnötigen Javascript-Code. Eine Funktion kann sich als überflüssig herausstellen, wenn Sie dennoch zulassen, dass Sie den Code selbst direkt übergeben, nicht zur Ausführung, sondern zur Einarbeitung. Zum Beispiel in den Foren.
2) $ v = str_replace ($ jsxss, "", $ v);Die Funktion ähnelt der ersten, nur in diesem Fall werden Ereignisse ausgeschnitten, die für xss-Angriffe verwendet werden können. Sie können diese Lösung leicht ändern und nicht nur das Ereignis selbst, sondern auch den Inhalt, den sie anhängen möchten, ausschneiden. Aber ich habe die Notwendigkeit dafür noch nicht gesehen
3) $ v = str_replace (Array ("*", "\\"), "", $ v);Und diese schädlichen Zeichen, insbesondere der Backslash, können dazu führen, dass Ihre SQL gehackt wird. Da das Symbol selbst ziemlich selten verwendet wird und seine potenzielle Gefahr ziemlich hoch ist, habe ich beschlossen, es im Keim zu zerstören.
4) $ v = mysql_real_escape_string ($ v);Die Verwendung dieser Funktion kann zu unnötigem Entweichen von Zeichen führen, da sie höchstwahrscheinlich bereits direkt beim Schreiben von Daten in die Datenbank verwendet wird. Auf der anderen Seite können Sie sich jedoch vor SQL-Injection schützen und Ihre Daten wie keine andere schützen. Wenn Sie es verwenden, müssen Sie die Funktion verwenden, nachdem Sie eine Verbindung zur Datenbank hergestellt haben. Vergessen wir auch nicht, dass mysql_real_escape_string in PHP 7 nicht verwendet wird und die Verwendung solcher Funktionen von der Verbindungsmethode abhängt. Wenn Sie beispielsweise über mysqli eine Verbindung zur Datenbank herstellen, müssen Sie möglicherweise die Funktion mysqli_real_escape_string verwenden.
5) $ v = strip_tags ($ v);Strip_tags helfen dabei, alle unnötigen Tags zu entfernen. Leider auch die notwendigen. Mit dem zweiten Parameter können Sie die Tags angeben, die Sie verlassen möchten. Das Problem ist jedoch, dass es so viele benötigte Tags gibt, dass das Auflisten ziemlich problematisch ist, und am bedauerlichsten ist, dass es auch Tags gibt, die Site-Entwickler selbst hinzufügen, um bestimmte Funktionen auf der Site zu erstellen. Natürlich wäre es viel bequemer, die Tags anzugeben, die entfernt und nicht verlassen werden müssen. Aber wir werden mit dem zufrieden sein, was wir haben. Darüber hinaus können für solche Entscheidungen reguläre Ausdrücke verwendet werden.
6) $ v = htmlentities ($ v, ENT_QUOTES, "UTF-8");
7) $ v = htmlspecialchars ($ v, ENT_QUOTES);Ich denke, dass diese beiden Funktionen nicht präsentiert werden müssen und eine der anderen ähnlich ist, so dass es völlig ausreicht, eine von ihnen zu verwenden. Trotzdem sind sie bei weitem nicht immer angemessen.
Im Moment ist das alles, was ich sammeln konnte. Wenn jemand etwas hat, um diesen Artikel zu ergänzen, werde ich mich nur freuen;)
PS Für diejenigen, die eine Lösung suchen und die Verwendung von PDO, Template-Engines, verschiedenen Servermodulen usw. anbieten möchten. Ich bestreite in keiner Weise, dass diese Lösung ihre Nachteile hat, und irgendwo wird sie die Schlussfolgerung verzerren und sogar die Funktionalität beeinträchtigen, für die ich zu Beginn des Beitrags geschrieben habe, dass die Lösung ihre Nachteile hat.
Dieser Beitrag richtet sich nicht an Programmierer, sondern an Site-Administratoren, denen das Wissen und die Erfahrung fehlen, um den Code von innen heraus zu ändern. Für diejenigen, die nicht für die Fertigstellung von Websites bezahlen wollen oder können. Was passiert oft, wenn ein Entwickler Websites auf einem kostengünstigen und oft völlig kostenlosen CMS billiger macht?
Um dies zu verhindern, müssen Sie Ihre Websites auf einem zuverlässigen und vertrauenswürdigen CMS mit qualitativ hochwertigem technischen Support entwickeln. Das am besten geeignete und funktionalste CMS für die Entwicklung solcher Projekte ist Bitrix. Bestellung bei uns unter
https: // wazzup . Hosting und Bitrix Lizenz, wir sind bereit, den Store kostenlos zu konfigurieren und zu installieren.
Bitte beachten Sie auch, dass wir ein Sonderangebot für den Kauf einer Bitrix-Lizenz haben. Bis zu 6 Monate Hosting sind kostenlos.
Unsere Kunden entscheiden sich für Bitrix, da dies das einzige größte Site-Management-System in der Russischen Föderation mit einem riesigen technischen Support-System und leistungsstarken Funktionen ist. Die Zuverlässigkeit von Bitrix wird nicht nur von der Zeit bestimmt, sondern auch von der ständigen qualifizierten technischen Unterstützung der Programmierer im Gegensatz zum kostenlosen und kostengünstigen CMS, dessen Entwicklung und Support von ständig wechselnden Enthusiasten ohne viel Erfahrung durchgeführt wird.