Jeder ist mit der SQL -Injektion vertraut. Es ist eine gemeinsame Angriffsmethode. Angreifer geben einige seltsame SQL -Fragmente in die Forminformationen oder die URL der Schnittstelle ein, wie z. Daher müssen wir in unserer Anwendung arbeiten, um solche Angriffsmethoden zu verhindern. In einigen Anwendungen mit hoher Sicherheit wie der Banksoftware verwenden wir häufig die Methode, um alle SQL -Anweisungen durch gespeicherte Verfahren zu ersetzen, um die SQL -Injektion zu verhindern. Dies ist natürlich sehr sicher, aber wir brauchen diese starre Methode in unserer täglichen Entwicklung möglicherweise nicht.
Als semi-automatischer Persistenzschicht-Framework muss das MyBatis-Framework manuell von uns selbst geschrieben werden. Zu diesem Zeitpunkt ist natürlich erforderlich, die SQL -Injektion zu verhindern. Tatsächlich ist MyBatis 'SQL eine Struktur mit der Funktion "Eingabe + Ausgabe", ähnlich einer Funktion, wie folgt:
<select id = "getBlogbyId" resultType = "Blog" "parameterType =" int "> <br> ID, Titel, Autor, Inhalt aus dem Blog wobei id = {id} </select> Hier gibt ParameterType den Eingangsparametertyp an, und der resultType zeigt den Ausgangsparametertyp an. Als Reaktion auf das oben genannte SQL -Injektion müssen wir natürlich hart daran arbeiten, Parameter einzugeben. Der hervorgehobene Teil im obigen Code ist der Teil, in dem die Eingabeparameter in SQL gespleißt werden. Drucken Sie die ausgeführte SQL -Anweisung nach dem Geben der Parameter aus und Sie werden sehen, dass SQL so aussieht:
Wählen Sie ID, Titel, Autor, Inhalt aus dem Blog, wobei ID =?
Unabhängig davon, welche Parameter eingegeben werden, ist der gedruckte SQL so. Dies liegt daran, dass MyBatis die Vorkompilierungsfunktion ermöglicht. Bevor SQL ausgeführt wird, wird die obige SQL zur Zusammenstellung an die Datenbank gesendet. Während der Ausführung können Sie den kompilierten SQL direkt verwenden und den Platzhalter "ersetzen"? ". Da die SQL -Injektion nur zum Kompilierungsprozess funktionieren kann, kann diese Methode das Problem der SQL -Injektion vermeiden.
Wie erreicht MyBatis eine Vorverbindung von SQL? Tatsächlich ist am unteren Rahmen des Rahmens die vorbereitete Stattungsklasse in JDBC am Werk. PreparedStatement ist eine Unterklasse der Aussage, mit der wir sehr vertraut sind. Sein Objekt enthält kompilierte SQL -Anweisungen. Dieser "Ready" -Ansatz verbessert nicht nur die Sicherheit, sondern verbessert auch die Effizienz, wenn ein SQL mehrmals ausgeführt wird, da SQL zusammengestellt wurde und bei erneutem Ausführen nicht kompiliert werden muss.
Können wir jedoch die SQL -Injektion durch die Verwendung von MyBatis verhindern? Natürlich nicht sehen Sie den folgenden Code:
<select id = "orderblog" resultType = "blog" parameterType = "map"> ID, Titel, Autor, Inhalt aus der Blog -Bestellung von $ {orderparam} </select> Nach sorgfältiger Beobachtung hat sich das Format des Inline -Parameters von "#{xxx}" zu $ {xxx} geändert. Wenn wir den Parameter "orderparam" zuweisen und die SQL drucken, sieht es so aus:
Wählen Sie ID, Titel, Autor, Inhalt aus der Blog -Bestellung nach ID aus
Offensichtlich kann dies die SQL -Injektion nicht verhindern. In MyBatis beteiligen sich Parameter im Format "$ {xxx}" direkt an der SQL -Kompilierung und verhindert so Injektionsangriffe. Wenn es jedoch um dynamische Tabellennamen und Spaltennamen geht, können wir nur Parameterformate wie "$ {xxx}" verwenden. Daher müssen wir solche Parameter im Code manuell verarbeiten, um die Injektion zu verhindern.
Schlussfolgerung: Beim Schreiben von MyBatis -Mapping -Anweisungen versuchen Sie, das Format "#{xxx}" zu verwenden. Wenn Sie Parameter wie "$ {xxx}" verwenden müssen, müssen Sie manuell gut filtern, um SQL -Injektionsangriffe zu verhindern.
Das obige ist der vollständige Inhalt des Java Persistence Layer -Frameworks MyBatis verhindert die SQL -Injektion, die der Editor Ihnen bringt. Ich hoffe, jeder wird Wulin.com mehr unterstützen ~