Heim Backend-Entwicklung PHP-Tutorial Vollständiges Verbot von SQL-Injection-Angriffen in PHP Teil 2

Vollständiges Verbot von SQL-Injection-Angriffen in PHP Teil 2

Dec 24, 2016 am 09:56 AM
php sql

Einer der SQL-Injection-Angriffe, die in PHP völlig verboten sind

1. Arten von Injektionsangriffen

Es mag viele verschiedene Arten von Angriffsmotivationen geben, aber auf den ersten Blick scheint es so dass es mehr Typen gibt. Dies trifft sehr zu, wenn ein böswilliger Benutzer eine Methode erfindet, mit der mehrere Abfragen ausgeführt werden können. Wir werden dies später in diesem Artikel ausführlich besprechen.

Wenn Ihr Skript eine SELECT-Anweisung ausführt, kann ein Angreifer die Anzeige jeder Zeile in einer Tabelle erzwingen – indem er eine Bedingung wie „1=1“ in die WHERE-Klausel einfügt, wie unten gezeigt (die Injektionsteil ist fett dargestellt):

SELECT * FROM wines WHERE sorte = 'lagrein' OR 1=1;'



Wie wir Wie bereits erwähnt, kann dies an sich eine nützliche Information sein, da sie die allgemeine Struktur der Tabelle (etwas, was ein einfacher Datensatz nicht kann) sowie die Hinterhaltsanzeige mit Datensätzen vertraulicher Informationen offenlegt.

Ein aktualisierter Kommando-Hinterhalt stellt eine direktere Bedrohung dar. Durch Platzieren anderer Attribute in der SET-Klausel kann ein Angreifer jedes Feld im aktuell aktualisierten Datensatz ändern, wie zum Beispiel das folgende Beispiel (in dem der injizierte Teil fett dargestellt ist):

UPDATE wines SET type= 'red', 'vintage'='9999' WHERE sorte = 'lagrein'



Durch Einfügen einer Konstante wie 1=1 werden Bedingungen zum WHERE hinzugefügt Klausel einer Aktualisierungsanweisung. Dieser Korrekturbereich kann auf jeden Datensatz erweitert werden, wie zum Beispiel im folgenden Beispiel (in dem der Injektionsteil fett dargestellt ist):

UPDATE wines SET type= 'red', 'vintage '='9999 WHERE sorte = 'lagrein' OR 1=1;'



Die wahrscheinlich gefährlichste Anweisung ist DELETE – das ist nicht schwer vorstellbar. Die Injektionstechnik ähnelt dem, was wir bereits gesehen haben – durch Modifizieren der WHERE-Klausel, um den Umfang der betroffenen Datensätze zu erweitern, wie im folgenden Beispiel (in dem der Injektionsteil fett dargestellt ist):

DELETE FROM wines WHERE sorte = 'lagrein' OR 1=1;'



 2. Multiple Query-Injection

Multiple Query-Injection erhöht das Potenzial Schaden, den ein Angreifer verursachen kann, indem er zulässt, dass mehrere schädliche Anweisungen in eine Abfrage einbezogen werden. Bei Verwendung der MySQL-Datenbank kann ein Angreifer dies leicht erreichen, indem er ein unerwartetes Abschlusszeichen in die Abfrage einfügt – ein injiziertes Anführungszeichen (einfaches oder doppeltes) markiert die erwartete Variable am Ende und fügt dann ein Semikolon hinzu. Jetzt kann am Ende des nun beendeten ursprünglichen Befehls ein zusätzlicher Angriffsbefehl hinzugefügt werden. Die ultimative schädliche Abfrage könnte so aussehen:

SELECT * FROM wines WHERE sorte = 'lagrein';
GRANT ALL ON *.* TO 'BadGuy@%' IDENTIFIED BY 'gotcha'; '



Durch diese Injektion wird ein neuer Benutzer „BadGuy“ erstellt und ihm Netzwerkprivilegien gewährt (alle Privilegien für alle Tabellen); darunter wird ein „unglückliches“ Passwort hinzugefügt diese einfache SELECT-Anweisung. Wenn Sie unserem Rat im vorherigen Artikel gefolgt sind, die Berechtigungen des Prozessbenutzers strikt einzuschränken, sollte dies nicht funktionieren, da der Webserver-Daemon nicht mehr über die von Ihnen entzogenen GRANT-Berechtigungen verfügt. Aber theoretisch könnte ein solcher Angriff BadGuy freie Hand geben, um die Kontrolle zu erlangen, die er über Ihre Datenbank hat.



Ob eine solche Mehrfachabfrage vom MySQL-Server verarbeitet wird, ist nicht eindeutig. Einiges davon kann auf unterschiedliche Versionen von MySQL zurückzuführen sein, meistens liegt es jedoch an der Art und Weise, wie mehrere Abfragen vorhanden sind. Das Überwachungsprogramm von MySQL lässt eine solche Abfrage vollständig zu. Die häufig verwendete MySQL-GUI-phpMyAdmin kopiert alle vorherigen Inhalte vor der endgültigen Abfrage und führt nur dies aus.

Allerdings werden die meisten Mehrfachabfragen in einem Injektionskontext von der MySQL-Erweiterung von PHP verarbeitet. Glücklicherweise ist die Ausführung mehrerer Anweisungen in einer Abfrage standardmäßig nicht zulässig; der Versuch, zwei Anweisungen auszuführen (wie die oben gezeigte Injektion), führt lediglich zu einem Fehler – es werden keine Fehler gesetzt und es werden keine Ausgabeinformationen angezeigt. In diesem Fall implementiert PHP zwar sein Standardverhalten nur „Schritt für Schritt“, schützt Sie jedoch vor den meisten einfachen Injektionsangriffen.

Die neue MySQLi-Erweiterung in PHP5 (siehe http://php.net/mysqli) unterstützt genau wie MySQL nicht von Natur aus mehrere Abfragen, bietet jedoch eine Funktion mysqli_multi_query(), die Sie bei der Implementierung unterstützt mehrere Abfragen - wenn Sie das wirklich wollen.

Allerdings ist die Situation noch schlimmer für SQLite, die einbettbare SQL-Datenbank-Engine, die mit PHP5 gebündelt ist (siehe http://sqlite.org/ und http://php.net/sqlite), die Aufmerksamkeit erregt aufgrund seiner einfachen Anwendung bei einer großen Anzahl von Benutzern beliebt. In einigen Fällen lässt SQLite solche Abfragen mit mehreren Anweisungen standardmäßig zu, da die Datenbank Batch-Abfragen optimieren kann, insbesondere die Batch-INSERT-Anweisungsverarbeitung, was sehr effizient ist. Wenn die Ergebnisse der Abfrage jedoch von Ihrem Skript verwendet werden (z. B. wenn Sie eine SELECT-Anweisung zum Abrufen von Datensätzen verwenden), lässt die Funktion sqlite_query() nicht die Ausführung mehrerer Abfragen zu.


3. INVISION Power BOARD SQL-Injection-Schwachstelle

Invision Power Board ist ein bekanntes Forensystem. Am 6. Mai 2005 wurde im Anmeldecode eine SQL-Injection-Sicherheitslücke entdeckt. Sein Erfinder ist James Bercegay von GulfTech Security Research.

Diese Anmeldeabfrage lautet wie folgt:

$DB->query('SELECT * FROM ibf_members WHERE id=$mid AND password='$pid'');
Wo , die Mitglieds-ID-Variable $mid und die Passwort-ID-Variable $pid werden von der Funktion my_cookie() mithilfe der folgenden zwei Codezeilen abgerufen:

$mid = intval($std->my_getcookie('member_id ')) ;
$pid = $std->my_getcookie('pass_hash');
Hier ruft die Funktion my_cookie() die angeforderten Variablen aus dem Cookie mithilfe der folgenden Anweisung ab:

return urldecode($ _COOKIE[$ibforums->vars['cookie_id'].$name]);
 【Hinweis】Der von diesem Cookie zurückgegebene Wert wird grundsätzlich nicht verarbeitet. Obwohl $mid vor der Anwendung auf die Abfrage in eine Ganzzahl umgewandelt wird, bleibt $pid unverändert. Daher ist es anfällig für Injektionsangriffe, die wir zuvor besprochen haben.

Daher wird diese Schwachstelle durch die Behebung der Funktion my_cookie() wie folgt aufgedeckt:

if ( ! in_array( $name, array('topicsread', 'forum_read', 'collapseprefs ') ) )
{
return $this->
clean_value(urldecode($_COOKIE[$ibforums->vars['cookie_id'].$name])) ;
}
else
{
return urldecode($_COOKIE[$ibforums->vars['cookie_id'].$name]);



🎜>Nach einer solchen Korrektur werden die Schlüsselvariablen nach dem „Übergeben“ der globalen Funktion clean_value() zurückgegeben, während andere Variablen nicht überprüft werden.

Nachdem wir nun ein allgemeines Verständnis davon haben, was SQL-Injection ist, sein Injektionsprinzip und die Anfälligkeit dieser Injektion, wollen wir untersuchen, wie wir sie effektiv verhindern können. Glücklicherweise stellt uns PHP reichlich Ressourcen zur Verfügung, sodass wir mit voller Sicherheit vorhersagen können, dass eine Anwendung, die sorgfältig und gründlich mit unseren empfohlenen Techniken erstellt wurde, im Grunde jede Möglichkeit einer SQL-Injection aus Ihren Skripten ausschließt. Dies wird durch die „Liquidierung“ Ihrer Benutzer erreicht. Daten, bevor sie Schaden anrichten können.

4. Definieren Sie jeden Wert in Ihrer Abfrage

Wir empfehlen Ihnen, sicherzustellen, dass Sie jeden Wert in Ihrer Abfrage definieren. Als erstes sind String-Werte betroffen, ebenso wie Inhalte, bei denen man normalerweise die Verwendung von „einfachen“ (statt „doppelten“) Anführungszeichen erwarten würde. Einerseits kann die Verwendung von doppelten Anführungszeichen, um PHP den Austausch von Variablen innerhalb eines Strings zu ermöglichen, die Eingabe von Abfragen erleichtern, andererseits wird dies (zugegebenermaßen nur ein sehr geringer Teil) auch den Bedarf an zukünftigem PHP verringern Code-Analyse-Arbeit.

Als nächstes verwenden wir die Nicht-Injektionsabfrage, die wir zu Beginn verwendet haben, um dieses Problem zu veranschaulichen:

SELECT * FROM wines WHERE sorte = 'lagrein'
Oder in PHP-Anweisung ausgedrückt als:

$query = 'SELECT * FROM wines WHERE sorte = '$variety'';
Technisch gesehen müssen Anführungszeichen nicht auf numerische Werte angewendet werden. Wenn es Ihnen jedoch nichts ausmacht, einen Wert für ein Feld wie Wein in Anführungszeichen zu setzen, und wenn Ihr Benutzer einen Nullwert in Ihr Formular eingibt, sehen Sie etwa Folgendes: Abfrage:

SELECT * FROM wines WHERE vintage =
Natürlich ist diese Abfrage syntaktisch ungültig; die folgende Syntax ist jedoch gültig:

SELECT * FROM wines WHERE vintage = ''
Die zweite Abfrage wird (wahrscheinlich) zurückgeben Nichts, aber es wird zumindest keine Fehlermeldung zurückgegeben.


5. Überprüfen Sie die Art des vom Benutzer übermittelten Werts


Aus der vorherigen Diskussion können wir bisher den wichtigen Ursprung der SQL-Injection erkennen kommt oft zu einem unerwarteten Formularimport. Wenn Sie dem Benutzer jedoch die Möglichkeit geben, bestimmte Werte über ein Formular zu übermitteln, sollten Sie eine gute Vorstellung davon haben, welche Eingaben Sie erhalten möchten – dies kann es einfacher machen, die Gültigkeit der Eingaben des Benutzers zu überprüfen. Wir haben solche Verifizierungsheader bereits in früheren Artikeln besprochen, daher fassen wir hier nur kurz die wichtigsten Punkte zusammen, die wir damals besprochen haben. Wenn Sie eine Zahl betrachten, können Sie eine dieser Techniken verwenden, um sicherzustellen, dass Sie tatsächlich einen numerischen Typ erhalten:

Verwenden Sie die Funktion is_int() (oder is_integer() oder is_long()). .

 · Wenden Sie die Funktion gettype() an.

 · Wenden Sie die Funktion intval() an.

 · Wenden Sie die Funktion settype() an.

Um die Länge der Benutzereingabe zu überprüfen, können Sie die Funktion strlen() verwenden. Um zu überprüfen, ob eine gewünschte Uhrzeit oder ein gewünschtes Datum gültig ist, können Sie die Funktion strtotime() verwenden. Dadurch wird mit ziemlicher Sicherheit sichergestellt, dass der Import eines Benutzers kein Semikolon enthält (es sei denn, Satzzeichen können zulässigerweise enthalten sein). Sie können dies ganz einfach mit Hilfe der Funktion strpos() erreichen, wie unten gezeigt:

if( strpos( $variety, ';' ) ) exit ( '$variety ist ein ungültiger Wert für Vielfalt !' );
Wie wir bereits erwähnt haben, sollten Sie das Vorhandensein vieler Probleme leicht erkennen können, solange Sie die Erwartungen Ihrer Benutzereingaben sorgfältig analysieren.

6. Filtern Sie jedes verdächtige Zeichen aus Ihrer Abfrage heraus

Obwohl wir in früheren Artikeln besprochen haben, wie man Titel mit gefährlichen Zeichen herausfiltert, wollen wir diesen Titel hier kurz übertreiben und zusammenfassen Nochmals:

· Verwenden Sie nicht den Befehl magic_quotes_gpc oder seine Funktion „Behind-the-Scenes-Partner“-addslashes(), die in der Anwendungsentwicklung eingeschränkt ist. Und diese Funktion erfordert auch die Anwendung eines zusätzlichen Schritts – die Anwendung der Funktion „stripslashes()“.

 · Im Vergleich dazu wird die Funktion mysql_real_escape_string() häufiger verwendet, weist aber auch ihre eigenen Mängel auf.

Das Obige ist der zweite Teil des vollständigen Verbots von SQL-Injection-Angriffen in PHP. Weitere verwandte Inhalte finden Sie auf der chinesischen PHP-Website (www.php.cn)!



Erklärung dieser Website
Der Inhalt dieses Artikels wird freiwillig von Internetnutzern beigesteuert und das Urheberrecht liegt beim ursprünglichen Autor. Diese Website übernimmt keine entsprechende rechtliche Verantwortung. Wenn Sie Inhalte finden, bei denen der Verdacht eines Plagiats oder einer Rechtsverletzung besteht, wenden Sie sich bitte an admin@php.cn

Heiße KI -Werkzeuge

Undresser.AI Undress

Undresser.AI Undress

KI-gestützte App zum Erstellen realistischer Aktfotos

AI Clothes Remover

AI Clothes Remover

Online-KI-Tool zum Entfernen von Kleidung aus Fotos.

Undress AI Tool

Undress AI Tool

Ausziehbilder kostenlos

Clothoff.io

Clothoff.io

KI-Kleiderentferner

Video Face Swap

Video Face Swap

Tauschen Sie Gesichter in jedem Video mühelos mit unserem völlig kostenlosen KI-Gesichtstausch-Tool aus!

Heiße Werkzeuge

Notepad++7.3.1

Notepad++7.3.1

Einfach zu bedienender und kostenloser Code-Editor

SublimeText3 chinesische Version

SublimeText3 chinesische Version

Chinesische Version, sehr einfach zu bedienen

Senden Sie Studio 13.0.1

Senden Sie Studio 13.0.1

Leistungsstarke integrierte PHP-Entwicklungsumgebung

Dreamweaver CS6

Dreamweaver CS6

Visuelle Webentwicklungstools

SublimeText3 Mac-Version

SublimeText3 Mac-Version

Codebearbeitungssoftware auf Gottesniveau (SublimeText3)

PHP 8.4 Installations- und Upgrade-Anleitung für Ubuntu und Debian PHP 8.4 Installations- und Upgrade-Anleitung für Ubuntu und Debian Dec 24, 2024 pm 04:42 PM

PHP 8.4 bringt mehrere neue Funktionen, Sicherheitsverbesserungen und Leistungsverbesserungen mit einer beträchtlichen Menge an veralteten und entfernten Funktionen. In dieser Anleitung wird erklärt, wie Sie PHP 8.4 installieren oder auf PHP 8.4 auf Ubuntu, Debian oder deren Derivaten aktualisieren. Obwohl es möglich ist, PHP aus dem Quellcode zu kompilieren, ist die Installation aus einem APT-Repository wie unten erläutert oft schneller und sicherer, da diese Repositorys in Zukunft die neuesten Fehlerbehebungen und Sicherheitsupdates bereitstellen.

So richten Sie Visual Studio-Code (VS-Code) für die PHP-Entwicklung ein So richten Sie Visual Studio-Code (VS-Code) für die PHP-Entwicklung ein Dec 20, 2024 am 11:31 AM

Visual Studio Code, auch bekannt als VS Code, ist ein kostenloser Quellcode-Editor – oder eine integrierte Entwicklungsumgebung (IDE) –, die für alle gängigen Betriebssysteme verfügbar ist. Mit einer großen Sammlung von Erweiterungen für viele Programmiersprachen kann VS Code c

Erklären Sie JSON Web Tokens (JWT) und ihren Anwendungsfall in PHP -APIs. Erklären Sie JSON Web Tokens (JWT) und ihren Anwendungsfall in PHP -APIs. Apr 05, 2025 am 12:04 AM

JWT ist ein offener Standard, der auf JSON basiert und zur sicheren Übertragung von Informationen zwischen Parteien verwendet wird, hauptsächlich für die Identitätsauthentifizierung und den Informationsaustausch. 1. JWT besteht aus drei Teilen: Header, Nutzlast und Signatur. 2. Das Arbeitsprinzip von JWT enthält drei Schritte: Generierung von JWT, Überprüfung von JWT und Parsingnayload. 3. Bei Verwendung von JWT zur Authentifizierung in PHP kann JWT generiert und überprüft werden, und die Funktionen und Berechtigungsinformationen der Benutzer können in die erweiterte Verwendung aufgenommen werden. 4. Häufige Fehler sind Signaturüberprüfungsfehler, Token -Ablauf und übergroße Nutzlast. Zu Debugging -Fähigkeiten gehört die Verwendung von Debugging -Tools und Protokollierung. 5. Leistungsoptimierung und Best Practices umfassen die Verwendung geeigneter Signaturalgorithmen, das Einstellen von Gültigkeitsperioden angemessen.

Wie analysiert und verarbeitet man HTML/XML in PHP? Wie analysiert und verarbeitet man HTML/XML in PHP? Feb 07, 2025 am 11:57 AM

Dieses Tutorial zeigt, wie XML -Dokumente mit PHP effizient verarbeitet werden. XML (Extensible Markup-Sprache) ist eine vielseitige textbasierte Markup-Sprache, die sowohl für die Lesbarkeit des Menschen als auch für die Analyse von Maschinen entwickelt wurde. Es wird üblicherweise für die Datenspeicherung ein verwendet und wird häufig verwendet

PHP -Programm zum Zählen von Vokalen in einer Zeichenfolge PHP -Programm zum Zählen von Vokalen in einer Zeichenfolge Feb 07, 2025 pm 12:12 PM

Eine Zeichenfolge ist eine Folge von Zeichen, einschließlich Buchstaben, Zahlen und Symbolen. In diesem Tutorial wird lernen, wie Sie die Anzahl der Vokale in einer bestimmten Zeichenfolge in PHP unter Verwendung verschiedener Methoden berechnen. Die Vokale auf Englisch sind a, e, i, o, u und sie können Großbuchstaben oder Kleinbuchstaben sein. Was ist ein Vokal? Vokale sind alphabetische Zeichen, die eine spezifische Aussprache darstellen. Es gibt fünf Vokale in Englisch, einschließlich Großbuchstaben und Kleinbuchstaben: a, e, ich, o, u Beispiel 1 Eingabe: String = "TutorialPoint" Ausgabe: 6 erklären Die Vokale in der String "TutorialPoint" sind u, o, i, a, o, ich. Insgesamt gibt es 6 Yuan

Erklären Sie die späte statische Bindung in PHP (statisch: :). Erklären Sie die späte statische Bindung in PHP (statisch: :). Apr 03, 2025 am 12:04 AM

Statische Bindung (statisch: :) implementiert die späte statische Bindung (LSB) in PHP, sodass das Aufrufen von Klassen in statischen Kontexten anstatt Klassen zu definieren. 1) Der Analyseprozess wird zur Laufzeit durchgeführt.

Was sind PHP Magic -Methoden (__construct, __Destruct, __call, __get, __set usw.) und geben Sie Anwendungsfälle an? Was sind PHP Magic -Methoden (__construct, __Destruct, __call, __get, __set usw.) und geben Sie Anwendungsfälle an? Apr 03, 2025 am 12:03 AM

Was sind die magischen Methoden von PHP? Zu den magischen Methoden von PHP gehören: 1. \ _ \ _ Konstrukt, verwendet, um Objekte zu initialisieren; 2. \ _ \ _ Destruct, verwendet zur Reinigung von Ressourcen; 3. \ _ \ _ Call, behandeln Sie nicht existierende Methodenaufrufe; 4. \ _ \ _ GET, Implementieren Sie den dynamischen Attributzugriff; 5. \ _ \ _ Setzen Sie dynamische Attributeinstellungen. Diese Methoden werden in bestimmten Situationen automatisch aufgerufen, wodurch die Code -Flexibilität und -Effizienz verbessert werden.

Erklären Sie den Match -Expression (Php 8) und wie er sich vom Schalter unterscheidet. Erklären Sie den Match -Expression (Php 8) und wie er sich vom Schalter unterscheidet. Apr 06, 2025 am 12:03 AM

In PHP8 sind Übereinstimmungsausdrücke eine neue Kontrollstruktur, die unterschiedliche Ergebnisse basierend auf dem Wert des Expression zurückgibt. 1) Es ähnelt einer Switch -Anweisung, gibt jedoch einen Wert anstelle eines Ausführungsanweisungsblocks zurück. 2) Der Match -Ausdruck wird streng verglichen (===), was die Sicherheit verbessert. 3) Es vermeidet mögliche Auslassungen in Switch -Anweisungen und verbessert die Einfachheit und Lesbarkeit des Codes.

See all articles