Heim > Datenbank > MySQL-Tutorial > Hauptteil

Beispiele für SQL-Injection und wie man SQL-Injection verhindert

零下一度
Freigeben: 2017-05-09 13:29:58
Original
1566 Leute haben es durchsucht

Übersicht

  Bei der SQL-Injection wird die externe Schnittstelle einiger Datenbanken verwendet, um Benutzerdaten in die eigentliche Sprache des Datenbankbetriebs einzufügen. Um den Zweck zu erreichen, in die Datenbank und sogar in das Betriebssystem einzudringen. Im Bereich Sicherheit, 我们永远不要信任用户的输入 müssen wir feststellen, dass die vom Benutzer eingegebenen Daten nicht sicher sind, und wir alle müssen die vom Benutzer eingegebenen Daten filtern. 没有(运行时)编译,就没有注入。Der Weg, die oben genannten Arten von Angriffen grundsätzlich zu verhindern, besteht also darin, zu verhindern, dass Daten in Code umgewandelt und ausgeführt werden, und immer die Grenzen zwischen Code und Daten zu unterscheiden. Was speziell die SQL-Injection betrifft, wird der ausgeführte Schadcode über die SQL-Interpretations-Engine der Datenbank kompiliert, sodass lediglich verhindert werden muss, dass die vom Benutzer eingegebenen Daten vom Datenbanksystem kompiliert werden.
Im Gegensatz zu anderen Datenbanken kann MySQL in verschiedenen SQL-Modi (SQL-Server-Modus) ausgeführt werden und verschiedene Modi auf verschiedene Clients anwenden. Auf diese Weise kann jede Anwendung den Betriebsmodus des Servers an ihre eigenen Bedürfnisse anpassen. Das Schema definiert, welche SQL-Syntax MySQL unterstützen soll und welche Art von Datenvalidierungsprüfungen durchgeführt werden sollen. Dies ähnelt in gewisser Weise der Konfiguration verschiedener Ebenen von Fehlerprotokollen durch Apache, welche Fehler gemeldet werden und welche nicht.

SQL-Injection

1. Injektionsinstanz

//php代码
$unsafe_variable = $_POST['user_input'];   
mysql_query("INSERT INTO `table` (`column`) VALUES ('{$unsafe_variable}')");
Nach dem Login kopieren

Wenn der Code im Beitrag wie folgt lautet:

value'); DROP TABLE table;--
Nach dem Login kopieren

Abfrage--Code wird zu

INSERT INTO `table` (`column`) VALUES('value'); DROP TABLE table;--')
Nach dem Login kopieren

Dadurch wird die -Tabelle direkt gelöscht und Ihre Daten werden vernichtet.

2. SQL-Injection verhindern

Methode 1 prepareStatement+Bind-Variable: SQL-Anweisungen und Abfrageparameter werden jeweils zum Parsen an den Datenbankserver gesendet.
Es gibt zwei Implementierungsmethoden für PHP.

//使用PDO(PHP data object)
$stmt = $pdo->prepare('SELECT * FROM employees WHERE name = :name');  
$stmt->execute(array('name' => $name));  
foreach ($stmt as $row) {  
    // do something with $row  
}

//使用mysql扩展-mysqli
$stmt = $dbConnection->prepare('SELECT * FROM employees WHERE name = ?');
$stmt->bind_param('s', $name);
$stmt->execute();
$result = $stmt->get_result();
while ($row = $result->fetch_assoc()) {
    // do something with $row
}
Nach dem Login kopieren

Methode 2 Escape der Abfrageanweisung (die häufigste Methode): Verwenden Sie die von der Anwendung bereitgestellte Konvertierungsfunktion
. |Anwendung|Funktion|

|--------|
|MySQL C 
API
|
mysql_real_escape_string
()|
|MySQL++|escape和quote修饰符|
|PHP|使用mysql_real_escape_string()(适用于PHP4.3.0以前),之后可以使用mysqli或pdo|
|
Perl
 DBI|placeholder或quote()|
|Ruby DBI|placeholder或quote()|
Nach dem Login kopieren
Methode 3

Verwenden Sie Ihre eigene definierte Funktion
zur Überprüfung: Es handelt sich im Wesentlichen immer noch um Enter illegale Daten zum Entkommen und Filtern. Die Eingabevalidierung kann unterteilt werden in: 1. Daten organisieren, um sie gültig zu machen; 2. Bekannte illegale Eingaben ablehnen; 3. Nur bekanntermaßen legale Eingaben akzeptieren;

Methode 4

Gespeicherte Prozedur verwenden
. Informationen zu gespeicherten Prozeduren finden Sie unter: (9) Gespeicherte Prozeduren und benutzerdefinierte Funktionen in MySQL

SQL-Servermodus

1.SQL-Modus Syntax

#查看当前sql模式
select @@sql_mode;
#查看当前sql模式
SELECT @@session.sql_mode;
#修改当前sql模式
SET [SESSION][GLOBAL] sql_mode='modes';
Nach dem Login kopieren
    Die Sitzungsoption bedeutet, dass sie nur in dieser Verbindung wirksam wird. Global bedeutet, dass sie in dieser Verbindung nicht wirksam wird und in der nächsten Verbindung wirksam wird .
  • Sie können auch „--sql-mode='modes'“ verwenden, um sql_mode festzulegen, wenn MySQL startet.
  • kann in der
  • Konfigurationsdatei

    eingestellt werden. 2.sql_mode allgemeine Werte

    ONLY_FULL_GROUP_BY:

    Für den Vorgang GROUP BYAggregation
    wird angezeigt, wenn die Spalte in SELECT nicht in GROUP ist in BY ist diese SQL ungültig, da die Spalte nicht in der GROUP BY-Klausel enthalten ist.

NO_AUTO_VALUE_ON_ZERO:

Dieser Wert beeinflusst das Einfügen automatisch vergrößernder Spalten. Unter den Standardeinstellungen bedeutet das Einfügen von 0 oder NULL, dass der nächste automatisch steigende Wert generiert wird. Diese Option ist nützlich, wenn der Benutzer einen Wert von 0 einfügen möchte und die Spalte automatisch vergrößert wird.

STRICT_TRANS_TABLES:

Wenn in diesem Modus ein Wert nicht in eine Transaktionstabelle eingefügt werden kann, wird der aktuelle Vorgang unterbrochen und es gibt keine Begrenzung für Nicht-Transaktionstabellen .

NO_ZERO_IN_DATE:

Im strengen Modus sind null Tage und Monate nicht zulässig.

NO_ZERO_DATE:

Legen Sie diesen Wert fest. Die MySQL-Datenbank erlaubt das Einfügen von Nulldaten nicht und das Einfügen von Nulldaten löst einen Fehler anstelle einer Warnung aus.

ERROR_FOR_pISION_BY_ZERO:

Während INSERT oder UPDATE wird ein Fehler anstelle einer Warnung generiert, wenn Daten durch Null geteilt werden. Wenn der Modus nicht angegeben ist, gibt MySQL NULL zurück, wenn die Daten durch Null geteilt werden.

NO_AUTO_CREATE_USER:

Verhindert, dass GRANT Benutzer mit leeren Passwörtern erstellt.

NO_ENGINE_SUBSTITUTION:

Wirft einen Fehler aus, wenn die erforderliche Speicher-Engine deaktiviert oder nicht kompiliert ist. Wenn dieser Wert nicht festgelegt ist, wird stattdessen die Standardspeicher-Engine verwendet und eine Ausnahme ausgelöst.

PIPES_AS_CONCAT:
behandelt „||“ als Verkettung Operator von String anstelle von oder Operator , was der ist Identisch mit der Oracle-Datenbank und ähnelt der Zeichenfolgenverkettungsfunktion Concat.

ANSI_QUOTES:
Wenn ANSI_QUOTES aktiviert ist, können Sie eine -Zeichenfolge nicht in doppelte Anführungszeichen setzen, da sie als Bezeichner interpretiert wird.

Erklärung

Die sql_mode-Einstellung von ORACLE entspricht: PIPES_AS_CONCAT, ANSI_QUOTES, IGNORE_SPACE, NO_KEY_OPTIONS, NO_TABLE_OPTIONS, NO_FIELD_OPTIONS, NO_AUTO_CREATE_USER.

[Verwandte Empfehlungen]

1. Kostenloses MySQL-Online-Video-Tutorial

2. Neuestes MySQL-Handbuch-Tutorial

3. Boolean Education Yan Shiba MySQL-Einführungsvideo-Tutorial

Das obige ist der detaillierte Inhalt vonBeispiele für SQL-Injection und wie man SQL-Injection verhindert. Für weitere Informationen folgen Sie bitte anderen verwandten Artikeln auf der PHP chinesischen Website!

Verwandte Etiketten:
Quelle: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
Beliebte Tutorials
Mehr>
Neueste Downloads
Mehr>
Web-Effekte
Quellcode der Website
Website-Materialien
Frontend-Vorlage
Über uns Haftungsausschluss Sitemap
Chinesische PHP-Website:Online-PHP-Schulung für das Gemeinwohl,Helfen Sie PHP-Lernenden, sich schnell weiterzuentwickeln!