Heim  >  Artikel  >  Datenbank  >  Machen Sie sich in einer Minute mit SQL-Injection vertraut

Machen Sie sich in einer Minute mit SQL-Injection vertraut

醉折花枝作酒筹
醉折花枝作酒筹nach vorne
2021-08-02 16:01:222067Durchsuche

Durch das Einfügen von SQL-Befehlen in Webformularübermittlungen oder die Eingabe von Domänennamen oder Abfragezeichenfolgen für Seitenanfragen können Sie den Server letztendlich dazu verleiten, bösartige SQL-Befehle auszuführen. Konkret nutzt es bestehende Anwendungen, um (bösartige) SQL-Befehle zur Ausführung in die Hintergrund-Datenbank-Engine einzuschleusen und so eine Datenbank auf einer Website mit Sicherheitslücken zu erhalten.

Machen Sie sich in einer Minute mit SQL-Injection vertraut

SQL-Injection, SQL-Injection, nutzt tatsächlich Code-Schwachstellen, um die Semantik von SQL zu ändern und dadurch bösartige SQL-Anweisungen zu bilden.

$username = $_POST['username'];
$password = $_POST['password'];

$query = "select * from users where username = '{$username}' and password = '{$password}'";

// 判断是否登录成功
if (DB::select($query)) {
    return true;
}

return false;

Auf den ersten Blick ist an diesem Pseudocode nichts auszusetzen korrekt ist und zurückgegeben wird, wenn es wahr ist, ist die Anmeldung zulässig. Aber wenn der eingehende Benutzername 123' oder 1=1;# ist, dann wird die SQL-Anweisung zu

select * from users where username = '123' or 1=1;
# and password = '{$password}'";

Diese bösartige SQL-Anweisung wird jederzeit „true“ zurückgeben, da 1=1

über ORM

uns injiziert wird. Wie bereits erwähnt SQL-Injection nutzt Code-Schwachstellen, um die Semantik von SQL zu ändern, was bedeutet, dass ORM auch ein potenzieller Injektionspunkt ist. Am Beispiel von tp3.2 gibt es den folgenden Code:

$result = D('User')->where([
    'username' => $_POST['username'],
    'password' => $_POST['password'],
]);

if ($result) {
    echo '登录成功';
} else {
    echo '登录失败';
}

Dieser Code scheint kein Problem zu sein, aber wenn der Benutzername in username[0]=neq&username[1]=1111 übergeben wird, lautet die Abfrageanweisung

$result = D('User')->where([
    'username' => ['neq', 111],
    'password' => $_POST['password'],
]);

dann ist das Ergebnis von $result immer wahr

Präventionsmethode

  • Führen Sie eine Datentypbeurteilung und Datentypkonvertierung für die eingehenden Parameter durch

  • Entfernen Sie die Anführungszeichen, PHP kann Addslashes verwenden, mysql_real_escape_string Funktionen wie

  • Vorverarbeitungsanweisungen sind der effektivste Weg, um SQL-Injection zu verhindern.

  • Code-Audit. Wie vorbereitete Anweisungen SQL-Injection verhindern. Vorbereitete Anweisungen werden von der Datenbank implementiert, z. B. von MySQL. Lassen Sie uns zunächst über den grundlegenden Prozess der Vorverarbeitung sprechen. MySQL empfängt die vorverarbeitete SQL-Vorlage und beginnt sofort mit der Analyse (lexikalisch und syntaktisch). Der Client sendet Daten, um die Platzhalter (?) in der SQL-Vorlage zu ersetzen

  • MySQL führt die Anweisung aus und gibt das Ergebnis zurück

Löschen Sie die vorbereitete Anweisung (optional)

  • Wie verhindern vorbereitete Anweisungen also die SQL-Injection? Zunächst geht es bei der sogenannten SQL-Injection darum, die Semantik von SQL gewaltsam zu verändern. In Schritt eins wurde die Anweisung verarbeitet und die Semantik von SQL wurde korrigiert. Durch das Ersetzen der Platzhalter in Schritt zwei wird sich die Semantik von SQL nicht ändern. Das Folgende ist ein Beispiel für PHP PDO

    $stmt = $pdo->prepare("select * from users where username = '?' and password = '?'");
    
    $stmt->execute("123' or 1=1;#", 'test');
  • Verwandte Empfehlungen: „
  • MySQL-Tutorial

Das obige ist der detaillierte Inhalt vonMachen Sie sich in einer Minute mit SQL-Injection vertraut. Für weitere Informationen folgen Sie bitte anderen verwandten Artikeln auf der PHP chinesischen Website!

Stellungnahme:
Dieser Artikel ist reproduziert unter:segmentfault.com. Bei Verstößen wenden Sie sich bitte an admin@php.cn löschen