Heim  >  Artikel  >  Datenbank  >  MySQL Advanced (24) Zusammenfassung der Methoden zur Abwehr von SQL-Injection

MySQL Advanced (24) Zusammenfassung der Methoden zur Abwehr von SQL-Injection

黄舟
黄舟Original
2017-02-11 10:53:471460Durchsuche

Zusammenfassung der Methoden zur Abwehr von SQL-Injection

Dieser Artikel erläutert hauptsächlich die Methoden zur Abwehr von SQL-Injection, stellt vor, was Injektion ist, was der Grund für die Injektion ist und wie sie durchgeführt wird Freunde können sich darauf berufen.

SQL-Injection ist eine sehr schädliche Angriffsform. Obwohl der Schaden groß ist, ist die Verteidigung weitaus weniger schwierig als bei XSS.

SQL-Injection finden Sie unter: http://www.php.cn/

Der Grund für die SQL-Injection-Schwachstelle ist: SQL-Parameter spleißen. Das heißt, die für die Eingabe verwendeten Abfrageparameter werden direkt in die SQL-Anweisung eingebunden, was zu SQL-Injection-Schwachstellen führt.

1. Demonstrieren Sie die klassische SQL-Injection


Wir sehen: Wählen Sie ID und Nr. aus user where id=2;

Wenn die Anweisung durch Zusammenfügen von SQL-Strings erhalten wird, zum Beispiel: String sql = "select id,no from user where id=" + id;

Die ID ist ein vom Benutzer eingegebener Parameter. Wenn der Benutzer dann 2 eingibt, können wir die oben gefundenen Daten sehen. Wenn der Benutzer 2 oder 1=1 eingibt, wird ein SQL-Injection-Angriff ausgeführt.

Dann können Sie sehen, dass die obige Anweisung (select id,no from user where id=2 or 1=1;) alle Datensätze in der Benutzertabelle gefunden hat.

Dies ist eine typische SQL-Injection.

Schauen Sie sich eine andere Spalte an:

Wir sehen, dass die Tabelle sqlinject direkt über SQL gelöscht werden kann Injektion! Die Gefahren sind sichtbar!

2. Der Grund für die SQL-Injektion

Der Grund für die SQL-Injektion liegt oberflächlich darin, dass Zeichenfolgen zu SQL-Anweisungen und SQL-Anweisungen zusammengefügt werden werden nicht durch feste Variablen vorkompiliert und gebunden.

Der tiefere Grund ist jedoch, dass die vom Benutzer eingegebene Zeichenfolge als „SQL-Anweisung“ ausgeführt wird.

Zum Beispiel der obige String sql = "select id,no from user where id=" + id;

Wir hoffen, dass der vom Benutzer eingegebene Wert der ID nur als übergeben wird Geben Sie einen String-Literalwert in die Datenbank ein, aber wenn 2 oder 1=1 eingegeben wird, wird 1=1 nicht als Literalwert von where id= verwendet, sondern als SQL-Anweisung ausgeführt. Das Wesentliche besteht also darin, die Eingabedaten des Benutzers als Befehl auszuführen.

3. Abwehr gegen SQL-Injection

1> Grundsätzlich weiß jeder, dass die Verwendung von SQL-Anweisungen zum Vorkompilieren und Binden von Variablen der beste Weg ist, sich gegen SQL-Injection zu schützen. Aber nicht alle zugrunde liegenden Gründe werden verstanden.

String sql = "select id, no from user where id=?";

PreparedStatement ps = conn.prepareStatement(sql);

ps.setInt(1, id);

ps.executeQuery();

Wie oben gezeigt, handelt es sich um eine typische Verwendung der Vorkompilierung von SQL-Anweisungen und der Bindung von Variablen. Warum kann dies die SQL-Injektion verhindern?

Der Grund ist: Bei Verwendung von PreparedStatement wird die SQL-Anweisung „select id, no from user where id=?“ vorkompiliert, d. h. die SQL-Engine führt im Voraus eine Syntaxanalyse durch und generiert eine Der Syntaxbaum generiert einen Ausführungsplan. Das heißt, die Parameter, die Sie später eingeben, haben keinen Einfluss auf die grammatikalische Struktur der SQL-Anweisung, da die grammatikalische Analyse abgeschlossen ist und die grammatikalische Analyse hauptsächlich SQL analysiert Befehle wie „select“, „from“, „where“ und „order by“ usw. Selbst wenn Sie diese SQL-Befehle später eingeben, werden sie nicht als SQL-Befehle ausgeführt, da die Ausführung dieser SQL-Befehle zunächst eine Syntaxanalyse bestehen und einen Ausführungsplan generieren muss. Nachdem die Syntaxanalyse abgeschlossen ist, wurde sie vorkompiliert . , dann können die später eingegebenen Parameter absolut nicht als SQL-Befehle ausgeführt werden und werden nur als String-Literal-Parameter behandelt. Daher kann die Vorkompilierung von SQL-Anweisungen die SQL-Injection verhindern.

2> Allerdings können nicht alle Szenarien die Vorkompilierung von SQL-Anweisungen verwenden. Zu diesem Zeitpunkt müssen wir den Datentyp der Parameter streng überprüfen, und wir können auch einige Sicherheitsfunktionen für die SQL-Injektion verwenden.

Zum Beispiel String sql = "select id,no from user where id=" + id;

Beim Empfang der vom Benutzer eingegebenen Parameter prüfen wir streng die ID, die nur sein kann int-Typ. Komplexe Situationen können mithilfe regulärer Ausdrücke bestimmt werden. Dies kann auch die SQL-Injektion verhindern.

Verwendung sicherer Funktionen, wie zum Beispiel:

MySQLCodec codec = new MySQLCodec(Mode.STANDARD);

name = ESAPI.encoder().encodeForSQL(codec, name ) ;

String sql = "select id,no from user where name=" + name;

ESAPI.encoder().encodeForSQL(codec, name)

Dies Funktion Einige im Namen enthaltene Sonderzeichen werden codiert, sodass die SQL-Engine die Zeichenfolge im Namen nicht als SQL-Befehl für die Syntaxanalyse behandelt.

Hinweis

In tatsächlichen Projekten verwenden wir im Allgemeinen verschiedene Frameworks wie Ibatis, Mybatis, Hibernate usw. Sie verwenden im Allgemeinen standardmäßig vorkompiliertes SQL. Wenn Sie für ibatis/mybatis die Form #{name} verwenden, ist es SQL-vorkompiliert. Wenn Sie ${name} verwenden, ist es nicht SQL-vorkompiliert.

Das Obige ist eine Zusammenfassung der SQL-Injection-Verteidigungsmethoden. Ich hoffe, dass es für alle zukünftigen Studien hilfreich sein wird.

Schöne Texte und Bilder

Das ist it MySQL Advanced (24) Zusammenfassung der Methoden zur Abwehr von SQL-Injection Weitere verwandte Inhalte finden Sie auf der chinesischen PHP-Website (www.php.cn).


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