Für Anfänger: Übe mit Spring Boot und MyBatis! SQL -Injektionsrisiken und Prävention

Für Anfänger: Übe mit Spring Boot und MyBatis! SQL -Injektionsrisiken und Prävention

Sicherheitsmaßnahmen sind bei der Entwicklung von Webanwendungen unvermeidbar. Unter ihnen ist "SQL Injection" als ernsthafte Bedrohung für Datenbanken bekannt.

In diesem Artikel in einer leicht verständlichen Weise erklären, wie die SQL-Injektion funktioniert, und zeigen, wie Angriffe tatsächlich ausgeführt werden. Darüber hinaus einer sicheren Implementierung mit Spring Boot und MyBatis mit Code geben! Dies ist ein Muss für Webentwickler, von Anfängern bis hin zu Intermediate-Spielern.

Inhaltsverzeichnis

Was ist die SQL -Injektion? Erleben Sie die Gefahren von Angriffen durch Videos!

Die SQL Injection ist ein Angriff, bei dem Schwachstellen in einer Anwendung verwendet werden, um betrügerische Operationen in einer Datenbank zu starten.
Selbst wenn Sie es "ein bisschen schwierig aussehen ..." finden, können Sie eine grobe Vorstellung davon bekommen, welche Art von Angriff es ist, indem Sie das kurze Video unten ansehen!

📺 Sehen Sie sich die Demo auf YouTube an : Sie können sie aus diesem Link

Das Video erklärt, wie die SQL -Injektion mit einfachen Beispielen funktioniert.
Bitte schauen Sie sich an und fahren Sie mit dem nächsten Abschnitt fort, um mehr zu erfahren!

Was ist die SQL -Injektion?

eine Angriffstechnik, bei der ein Angreifer einen böswilligen SQL -Code injiziert, wenn eine Anwendung mit einer Datenbank interagiert wodurch ein Angreifer illegale Operationen ausführt.

Wenn dieser Angriff erfolgreich ist, gibt es Risiken wie:
  • Nicht autorisierte Datenerfassung : Benutzerinformationen und sensible Daten können durchgesickert werden.
  • Umgehung der Authentifizierung : Ein Angreifer kann sich möglicherweise unbefugt anmelden.
  • Data Manipulation und Löschen : Die Datenbank wird manipuliert und die Zuverlässigkeit wird beeinträchtigt.

Wie SQL -Injektion in konkreten Beispielen funktioniert

Die Anmeldungsfunktion erklärt, wie sie funktioniert. Beispielsweise wird SQL für die folgenden Parameter wie folgt konvertiert:

  • Benutzername: Admin
  • Passwort: Passwort
Wählen Sie Count (*)> 0 von Benutzern wob

Dies ist ein normales Verhalten, aber was passiert, wenn ein Angreifer so etwas eingibt:

  • Benutzername: 'oder' 1 '=' 1 ' -
  • Passwort: Jeder Wert

Dies kann wie folgt umgeschrieben werden:

Wählen Sie Count (*)> 0 von Benutzern, wobei userername = '' oder '1' = '1' - und password = 'Any Wert';

Ergebnis : - und Passwort = 'Jeder Wert' wird kommentiert von - Oder '1' = '1 ist immer wahr, sodass alle Benutzer als authentifiziert angesehen werden und nicht autorisierte Anmeldungen möglich sind.

Wie man mit SQL -Injektion umgeht

Die SQL -Injektion ist eine schwerwiegende Bedrohung für die Sicherheit von Anwendungen. Das Eingehen geeigneter Maßnahmen kann jedoch dieses Risiko effektiv mildern.

Dieses Mal werden wir erklären, wie Sie tatsächlich Maßnahmen mit Spring Boot und MyBatis Erfahren Sie, wie Sie sichere Anwendungen erstellen, indem Sie diese Tools nutzen.

1. Verwenden Sie eine parametrisierte Abfrage mit Platzhaltern

Zusammenfassung : Binden Sie die Parameter mit den Platzhaltern (#{}) sicher, anstatt Benutzereingaben direkt in SQL -Anweisungen einzubetten.
Grund : Platzhalter entkommen automatisch Eingangswerte und verhindern die SQL -Injektion.

Im Folgenden finden Sie die Codes, die Platzhalter und Codes verwenden, die nicht verwendet werden.
Die Unterschiede sind die Teile "'$ {Benutzername}' →#{Benutzername} '" und "' $ {Passwort} '→#{Passwort}'".

Bei MyBatis können Sie die Parameter sicher binden, indem Sie es auf
#{} Wenn Sie Parameter wie in SQL verwenden möchten, verwenden Sie #{}

Verletzlich

@Select ("zählen (*)> 0 von Benutzern wob

Sicherheit

@Select ("count (*)> 0 von Benutzern wobei userername = #{userername} und password = #{password}") boolean SecurAthenticate (@param ("Benutzername") String -Benutzername, @param ("Passwort") String Passwort);

2. Überprüfung und Desinfektion der Benutzereingabe

Zusammenfassung : Beschränken Sie die Typen und Formate, die Benutzer eingeben können, und verhindern Sie illegale Eingaben.
Grund : Das Entfernen von gefährlichen Zeichenfolgen und SQL -Schlüsselwörtern kann die Erfolgsrate Ihres Angriffs erheblich verringern.

den Zeichentyp und das Format eines Parameters einschränken oder bestimmte Zeichen (z. B. ' , - ,; usw. ) entfernen oder entkommen, um die SQL -Injektion zu vermeiden.

if (! userername.matches ("^[a-za-z0-9]+$")) {neue IllegalArgumentException ("Invaly Input"); }

Grundsätzlich ist es besser zu berücksichtigen, dass "1. Verwenden Sie eine parametrisierte Abfrage mit Platzhaltern", aber wenn sie unmöglich ist, kann diese Lösung die Erfolgsrate des Angriffs erheblich verringern.

3.. Vermeiden Sie dynamische Anfragen aufzubauen

Zusammenfassung : Verwendet parametrisierte Abfragen, anstatt dynamisch SQL -Anweisungen mit String -Operationen zu generieren.
Grund : Das Aufbau von SQL mit String -Manipulationen macht die SQL -Injektion wahrscheinlicher.

Dies unterscheidet sich ein wenig von den Gegenmaßnahmen, aber ich glaube, dass es am besten ist zu verstehen,
dass die Verwendung von String -Manipulation (+ Operatoren oder String.Format) beim Zusammenbau dynamischer SQL zu einem Risiko einer SQL -Injektion führt.

MyBatis wurde standardmäßig konzipiert, um die Verwendung von String -Operationen zum direkten Konstruktion von Abfragen zu vermeiden. Dies ist also kein Problem. Seien Sie jedoch vorsichtig, wenn Sie String -Operationen beim Zusammenbau dynamischer SQL verwenden.

In vergangenen Fällen habe ich Quellen gesehen, die eine Where -Anweisung mit String Manipulation erstellen und sie mit $ {} festlegen.
In diesem Fall nimmt natürlich die Möglichkeit einer SQL -Injektion zu.

public String buildWhereClause (String -Benutzername, String -E -Mail) {String WHUECLAURT = "WO 1 = 1"; if (userername! } if (E -Mail! } kehren Sie whereclause; } @Select ("Auswählen * von Benutzern $ {whregeclause}") Liste<User> findUsers (@param ("whrepeclause") String wobei);

Im Fall von mybatis,<if> Mit dieser Option können Sie dynamische Abfragen generieren. Verwenden Sie dies daher.

<select id="findUsers" resultType="User">Wählen Sie * von Benutzern, wobei 1 = 1<if test="username != null"> Und Benutzername = #{Benutzername}</if><if test="email != null"> Und E -Mail = #{E -Mail}</if></select>

4. Andere

Es gibt verschiedene andere Möglichkeiten, um die SQL -Injektion zu reduzieren, aber es ist wichtig zu verstehen, dass sie nicht perfekt ist und lediglich eine Minderung ist.

  • Legen Sie die Mindestdatenbankberechtigungen fest
  • Mit gespeicherten Verfahren
  • Bereitstellung der Webanwendungs -Firewall (WAF)
  • usw

Beispielimplementierung mit Spring Boot + MyBatis

Wie auf YouTube erwähnt, haben wir eine Beispielimplementierung aufgenommen, mit der Sie die SQL -Injektion tatsächlich nachweisen können.
Der gesamte Quellcode ist auf GitHub veröffentlicht. Bitte überprüfen Sie ihn, wenn Sie ihn benötigen.

💾 GitHub Repository : Überprüfen Sie den Quellcode unter diesem Link

Regler

Paket com.youtube.security.app.security_demo.controller; Importieren com.youtube.security.app.security_demo.repository.sqlinjectionMapper; import org.springframework.web.bind.annotation.postmapping; import org.springframework.web.bind.annotation.requestParam; import org.springframework.web.bind.annotation.restController; /** * Dieser Controller zeigt, wie SQL -Injektionsanfälligkeiten entstehen, und bietet eine sichere Implementierung mit * mybatis. * * SQL Injection ist eine Art von Angriff, die * beliebige SQL -Anweisungen in einer Datenbank ermöglicht, indem ein böswilliger SQL -Code in eine Abfrage eingefügt wird. * * Sicheres Implementierungsbeispiel: * - Verwenden Sie eine parametrisierte Abfrage mit Platzhaltern * -> Hemmt die SQL -Injektion durch Verwendung von Platzhaltern (#{}), anstatt Benutzereingaben direkt in die Abfrage einzubetten. * - Überprüfen und sanieren Sie die Benutzereingabe * -> die Sicherheit erhöhen, indem Sie den Charaktertyp einschränken, den der Benutzer eingeben kann, und entfernen und entkommen gefährliche Zeichen und Symbole. * - Vermeiden Sie die dynamische SQL -Erzeugung mit String -Operationen * -> Verwenden von String -Operationen (+ operatoren und String.Format) beim Zusammenbau dynamischer SQL das Risiko einer SQL -Injektion. * -> Es ist wichtig, Abfragen auf sichere Weise zusammenzustellen und sie nicht dynamisch mit String -Manipulationen zu generieren. * -> MyBatis wurde standardmäßig ausgelegt, um die Art und Weise zu vermeiden, wie Abfragen direkt mithilfe der String -Manipulation erstellt werden. * * * Diese Klasse sollte nur für Bildungszwecke verwendet werden. */ @RestController Public Class SqlinjectaController {private endgültige SQLINJECTIONMAPPER SQLINJECTIONMAPERMAPPER; public sqlinjunctionController (sqlinjectionMapper SQLINJECTIONMAPPER) {this.sqLinjectionMapper = sqlinjectionMapper; } /*** Beispiel für eine verletzliche Abfrage mit MyBatis. * * @param Benutzername Benutzername * @param Passwort Passwort * @Return Login -Ergebnis (Erfolg oder Fehler) */@postmapping ("/login/verwundbar") public String nulnerableLogin (@RequestParam userername, @Requestparam -String Passwort) {// MyBatis verletzlich query boolan isautaiuthent SQLINJECTIONMAPPER.VULNERABLEATAUTHENTATE (Benutzername, Passwort); Isauthenticated zurückgeben? "Erfolgsanmeldung (anfällige Implementierung)": "Fehlgeschlagene Anmeldung (anfällige Implementierung)"; } /*** Führen Sie parametrisierte Abfragen mit MyBatis aus. * * @param username Username * @param password Password * @return Login result (success or failure) */ @PostMapping("/login/secure") public String secureLogin(@RequestParam String username, @RequestParam String password) { // Call MyBatis secure query boolean isAuthenticated = sqlInjectionMapper.secureAuthenticate(username, password); Isauthenticated zurückgeben? "Erfolgreiche Anmeldung (sichere Implementierung)": "Fehlgeschlagene Anmeldung (sichere Implementierung)"; }}

Mapper

Paket com.youtube.security.app.security_demo.repository; import org.apache.ibatis.annotations.mapper; import org.apache.ibatis.annotations.param; import org.apache.ibatis.annotations.select; @Mapper Public Interface SQLINJECTIONSMAPPER { /*** Methode, die gefährdete SQL -Abfragen ausführt. * @param userername * @param Passwort Passwort * @return true Wenn die Authentifizierung erfolgreich ist, falsch, wenn Fehler */ @select ("Wählen Sie count ( *)> 0 von Benutzern wob /*** Methode zur Ausführung einer sicheren SQL -Abfrage. * @param Benutzername Benutzername * @param Passwort Passwort * @return true Wenn die Authentifizierung erfolgreich ist, falsch, wenn Fehler */ @select ("count ( *)> 0 von Benutzern wob }

Praxis der SQL -Injektion

Wir haben Tools, mit denen Sie die SQL -Injektion üben können.
Es ist auf Github erhältlich, nutzen Sie es also. (Auch wenn Sie es nicht verwenden, können Sie einfach dieselbe Anfrage senden und es gibt kein Problem.)

💾 GitHub Repository : Überprüfen Sie den Quellcode unter diesem Link

Das folgende YouTube -Video zeigt einen SQL -Injektionsangriff. Mit diesem Inhalt können Sie spezifische Beispiele für Angriffe persönlich erleben. Schauen Sie sich also bitte an.

📺 Sehen Sie sich die Demo auf YouTube an : Sie können sie aus diesem Link

Das Video zeigt, wie SQL -Injektionsanfälle Anwendungslücken ausnutzen. Es ist eine einfache Demonstration, aber es sollte Ihnen helfen, den Umriss des Angriffs zu verstehen.

Teilen Sie, wenn Sie möchten!

Wer hat diesen Artikel geschrieben

Dies ist ein Blog, in dem ich angefangen habe, Informationssicherheit zu studieren. Als neuer Angestellter würde ich mich freuen, wenn Sie mit einem breiten Herzen schauen könnten.
Es gibt auch Teech Lab, das eine Gelegenheit ist, Programmierspaß zu studieren. Wenn Sie also an der Softwareentwicklung interessiert sind, sollten Sie sich unbedingt ansehen!

Inhaltsverzeichnis