Heim >Backend-Entwicklung >Python-Tutorial >So vermeiden Sie SQL-Injection in Django

So vermeiden Sie SQL-Injection in Django

(*-*)浩
(*-*)浩Original
2019-05-09 09:54:435679Durchsuche

Methoden zur Vermeidung von SQL-Injection in Django: 1. Überprüfen Sie die Benutzereingaben. 2. Verwenden Sie keine dynamische Assemblierung von SQL. 3. Speichern Sie keine vertraulichen Informationen. 4. Geben Sie möglichst wenige Anwendungsausnahmeinformationen an 5. Verwenden Sie Dajngos ORM, um SQL-Injection effektiv zu vermeiden.

So vermeiden Sie SQL-Injection in Django

Was ist SQL-Injection?

Bei der sogenannten SQL-Injection werden SQL-Befehle in Webformularübermittlungen eingefügt oder Abfragezeichenfolgen für Domänennamen oder Seitenanfragen eingegeben, wodurch der Server letztendlich dazu verleitet wird, bösartige SQL-Befehle auszuführen. Konkret geht es um die Möglichkeit, vorhandene Anwendungen zu nutzen, um (bösartige) SQL-Befehle zur Ausführung in die Backend-Datenbank-Engine einzuschleusen. Sie können Informationen über eine Website mit Sicherheitslücken erhalten, indem Sie (bösartige) SQL-Anweisungen in eine Web-Datenbank eingeben als die vom Designer vorgesehene Ausführung von SQL-Anweisungen. Beispielsweise haben viele frühere Film- und Fernsehwebsites Passwörter von VIP-Mitgliedern preisgegeben, meist durch die Übermittlung von Abfragezeichen über WEB-Formulare. Solche Formulare sind besonders anfällig für SQL-Injection-Angriffe.

Zum Beispiel gibt es jetzt eine front_user-Tabelle in der Datenbank. Die Tabellenstruktur ist wie folgt:

class User(models.Model): telephone = models.CharField(max_length=11) username = models.CharField(max_length=100)
 password = models.CharField(max_length=100)

Dann verwenden wir native SQL-Anweisungen, um die folgenden Anforderungen zu erfüllen:

1. Implementieren Sie eine Ansicht, um Benutzerdetails basierend auf der Benutzer-ID zu erhalten. Der Beispielcode lautet wie folgt:

def index(request): user_id = request.GET.get('user_id') cursor = connection.cursor() cursor.execute('select 
id,username from front_user where id=%s' % user_id) rows = cursor.fetchall() for row in rows: print(row) 
return HttpResponse('success')

Oberflächlich betrachtet scheint dies kein Problem zu sein. Wenn jedoch die vom Benutzer übergebene Benutzer-ID gleich 1 oder 1 = 1 ist, lautet die obige gespleißte SQL-Anweisung:

select id,username from front_user where id=1 or 1=1

Die Bedingung der obigen SQL-Anweisung lautet id = 1 oder 1 = 1. Solange id=1 oder eine der beiden 1=1 wahr ist, ist die gesamte Bedingung wahr. Es besteht kein Zweifel, dass 1=1

definitiv gilt. Daher werden nach der Ausführung der obigen SQL-Anweisung alle Daten in der Tabelle front_user extrahiert.

2. Implementieren Sie eine Ansicht, die Benutzer basierend auf ihrem Benutzernamen extrahiert. Der Beispielcode lautet wie folgt:

def index(request): username = request.GET.get('username') cursor = connection.cursor() cursor.execute('select 
id,username from front_user where username='%s'' % username) rows = cursor.fetchall() for row in rows: print(row) 
return HttpResponse('success')

Oberflächlich betrachtet scheint dies kein Problem zu sein. Wenn der vom Benutzer übergebene Benutzername jedoch „zhiliao“ oder „1 = 1“ lautet, lautet die obige gespleißte SQL-Anweisung:

select id,username from front_user where username='zhiliao' or '1=1'

Die Bedingung der obigen SQL-Anweisung ist Benutzername = „zhiliao“ oder eine Zeichenfolge , kein Zweifel, das Urteil der Saite steht definitiv fest. Daher werden alle Daten in der Tabelle front_user extrahiert.

Die SQL-Injection-Verteidigung kann in die folgenden Punkte eingeteilt werden:

Das Obige ist das Prinzip der SQL-Injection. Er zerstört die ursprüngliche SQL-Anweisung, indem er einige bösartige Parameter übergibt, um seine eigenen Ziele zu erreichen. Natürlich ist SQL-Injection alles andere als einfach und das, worüber wir jetzt sprechen, ist nur die Spitze des Eisbergs. Wie kann man also eine SQL-Injection verhindern?

1. Vertrauen Sie niemals Benutzereingaben. Um die Eingabe des Benutzers zu überprüfen, können Sie reguläre Ausdrücke verwenden oder die Länge begrenzen; einfache Anführungszeichen und doppelte „-“ usw. konvertieren.

2. Verwenden Sie niemals die dynamische Assemblierung von SQL. Sie können parametrisierte SQL-Anweisungen oder direkt gespeicherte Prozeduren für die Datenabfrage und den Datenzugriff verwenden. Beispiel:

def index(request): user_id = '1 or 1=1' cursor = connection.cursor() cursor.execute('select id,username from 
front_user where id=%s',(user_id,)) rows = cursor.fetchall() for row in rows: print(row) return HttpResponse('success')

3. Verwenden Sie niemals eine Datenbankverbindung mit Administratorrechten. Verwenden Sie für jede Anwendung eine separate Datenbankverbindung mit eingeschränkten Rechten.

4. Speichern Sie vertrauliche Informationen nicht direkt, verschlüsseln oder hashen Sie Passwörter und sensible Informationen nicht.

5. Die Ausnahmeinformationen der Anwendung sollten so wenige Hinweise wie möglich geben. Es ist am besten, benutzerdefinierte Fehlerinformationen zu verwenden, um die ursprünglichen Fehlerinformationen zu umschließen.

Zusammenfassung:

1. Verwenden Sie SQL-Anweisungen, um Injektionsangriffe auf Webseiten durchzuführen, aber einige böswillige Benutzer verwenden spezielle SQL-Anweisungen Wenn Sie die Parameter nicht am Ende hochladen, kann dies zu Schäden an der Datenbank führen.

2 Überprüfen Sie beim Hochladen von Daten mit Get und Post die Parameter

3. Durch die Verwendung von Dajngos ORM kann die SQL-Injection effektiv vermieden werden, da Django Sonderzeichen maskiert hat

Das obige ist der detaillierte Inhalt vonSo vermeiden Sie SQL-Injection in Django. Für weitere Informationen folgen Sie bitte anderen verwandten Artikeln auf der PHP chinesischen Website!

Stellungnahme:
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