Heim  >  Artikel  >  Backend-Entwicklung  >  Lösen Sie den SQL-Injection-Backslash mit der PHP-Funktion

Lösen Sie den SQL-Injection-Backslash mit der PHP-Funktion

巴扎黑
巴扎黑Original
2016-11-23 15:30:241287Durchsuche

Was sind magische Anführungszeichen?

Wenn diese Option aktiviert ist, werden alle ' (einfaches Anführungszeichen), " (doppeltes Anführungszeichen), (Backslash) und NULL-Zeichen automatisch in eine Backslash-Definition umgewandelt. Dies hat das Gleiche Wirkung als addslashes(). Es gibt drei magische Zitatanweisungen:

magic_quotes_gpc wirkt sich auf HTTP-Anfragedaten aus (GET, POST und COOKIE). Siehe

magic_quotes_runtime. Wenn es aktiviert ist, geben die meisten Funktionen, die Daten aus externen Quellen abrufen, einschließlich Datenbanken und Textdateien, Daten mit Backslash-Escape zurück. Der Standardwert in PHP ist deaktiviert get_magic_quotes_runtime(). Wenn diese Option aktiviert ist, werden einfache Anführungszeichen anstelle von Backslashes verwendet. Wenn beide Optionen aktiviert sind, werden einfache Anführungszeichen, Backslashes und NULL-Zeichen nicht verwendet maskiert. Informationen zum Abrufen des Werts finden Sie unter ini_get()

addslashes – verwenden Sie Backslashes, um Zeichenfolgen in Anführungszeichen zu setzen >string addslashes (string $str)

Gibt eine Zeichenfolge mit hinzugefügten Backslashes zurück vor bestimmten Zeichen für Datenbankabfrageanweisungen. Diese Zeichen sind einfache Anführungszeichen ('), Backslash () und NUL (NULL-Zeichen).

Ein Beispiel für die Verwendung von addslashes() ist die Eingabe von Daten in eine Datenbank. Wenn Sie beispielsweise den Namen O'reilly in die Datenbank einfügen möchten, müssen Sie ihn maskieren. Die meisten Datenbanken verwenden als Escape-Zeichen: O'reilly. Dadurch werden die Daten in die Datenbank übernommen, ohne dass zusätzliche Dateien eingefügt werden müssen. Wenn die PHP-Direktive magic_quotes_sybase auf „on“ gesetzt ist, bedeutet dies, dass „beim Einfügen mit Escapezeichen versehen wird“.

Standardmäßig ist die PHP-Anweisung magic_quotes_gpc aktiviert, die addslashes() hauptsächlich automatisch für alle GET-, POST- und COOKIE-Daten ausführt. Verwenden Sie addslashes() nicht für Zeichenfolgen, die von magic_quotes_gpc maskiert wurden, da dies zu doppeltem Escapezeichen führt. Wenn Sie auf diese Situation stoßen, können Sie die Funktion get_magic_quotes_gpc() verwenden, um sie zu erkennen.

stripslashes

(PHP 4, PHP 5)

stripslashes – Zeichenfolge ohne Anführungszeichen, die mit addslashes() in Anführungszeichen gesetzt wird

Erklärung

string stripeslashes ( string $str )

Entfernt Anführungszeichen einer Zeichenfolge.

Hinweis: Wenn magic_quotes_sybase aktiviert ist, werden keine Backslashes entfernt, sondern stattdessen zwei Apostrophe durch eins ersetzt

Das SQL-Injection-Problem hat in ASP für großes Aufsehen gesorgt. Das berühmte PHP-Programm war im In- und Ausland „verzweifelt“. Zu den Details der SQL-Injection gibt es zu viele Artikel im Internet, daher werde ich sie hier nicht vorstellen.

Wenn magic_quotes_gpc in der php.ini-Datei Ihres Website-Bereichs deaktiviert ist, fügt PHP vor sensiblen Zeichen keinen Backslash () ein, da der vom Formular übermittelte Inhalt sensible Zeichen wie einfache Anführungszeichen enthalten kann. ('), was zu SQL-Injection-Schwachstellen führt. In diesem Fall können wir das Problem mit addslashes() lösen, das vor sensiblen Zeichen automatisch einen Backslash einfügt.

Die obige Methode ist jedoch nur anwendbar, wenn magic_quotes_gpc=Off. Als Entwickler wissen Sie nicht, ob magic_quotes_gpc für jeden Benutzer aktiviert oder deaktiviert ist. Wenn alle Daten mit addslashes() verwendet werden, bedeutet das nicht, dass „unschuldige Menschen wahllos getötet werden“? Wenn magic_quotes_gpc=On und die Funktion addslashes() verwendet wird, werfen wir einen Blick darauf:

//Wenn eine Variable $_POST['message'] aus dem Formular übermittelt wird, Der Inhalt ist Toms Buch

//Hier ist der Code zum Herstellen einer Verbindung zur MySQL-Datenbank, schreiben Sie ihn selbst

//Fügen Sie einen Backslash vor dem sensiblen Zeichen von $_POST['message'] hinzu

$_POST[ ' message'] = addslashes($_POST['message']);

//Since magic_quotes_gpc=On, fügen Sie erneut einen Backslash vor dem sensiblen Zeichen hinzu
$sql = "INSERT INTO msg_table VALUE (' $_POST[message]');";

//Sende eine Anfrage und speichere den Inhalt in der Datenbank

$query = mysql_query($sql);


//If If Wenn Sie diesen Datensatz aus der Datenbank extrahieren und ausgeben, sehen Sie Toms Buch
?>

In diesem Fall werden in der Umgebung, in der magic_quotes_gpc=On ist, alle eingegebenen einfachen Anführungszeichen (') in geändert (')...
Tatsächlich können wir dieses Problem leicht mit der Funktion get_magic_quotes_gpc() lösen. Wenn magic_quotes_gpc=On ist, gibt diese Funktion TRUE zurück; wenn magic_quotes_gpc=Off ist, gibt sie FALSE zurück. Zu diesem Zeitpunkt dürfte vielen Menschen klar geworden sein, dass das Problem gelöst ist. Bitte beachten Sie den Code:

//Wenn magic_quotes_gpc=Aus, dann fügen Sie Backslashes zu den sensiblen Zeichen in $_POST['message'] hinzu, die im Frachtbrief übermittelt werden
//Wenn magic_quotes_gpc=Ein, dann tun Sie es nicht hinzufügen
if (!get_magic_quotes_gpc()) {
$_POST['message'] = addslashes($_POST['message']);
} else {}
?>

Tatsächlich ist das Problem zu diesem Zeitpunkt gelöst. Hier ist noch ein kleiner Trick.
Manchmal wird mehr als eine Variable im Formular übermittelt, es können Dutzende oder Dutzende sein. Ist es also etwas mühsam, addslashes() immer wieder zu kopieren/einzufügen? Da die aus dem Formular oder der URL erhaltenen Daten in Form eines Arrays angezeigt werden, z. B. $_POST, $_GET)?D蔷多元ㄒ怡湓鹹蕉yuAngrongㄇЬ?“ php

function quotes($content)

{
//Wenn magic_quotes_gpc=Off, dann Verarbeitung starten
if (!get_magic_quotes_gpc()) {
//Bestimmen Sie, ob $content ein For-Array ist
if (is_array($content)) {
//Wenn $content ein Array ist, dann verarbeiten Sie jedes seiner Elemente
foreach ($content as $key=>$value) {
$content[$key] = addslashes($value);
}
} else {
//Wenn $content kein Array ist, wird es nur einmal verarbeitet
addslashes($content );
}
} else {
//Wenn magic_quotes_gpc=Ein, dann wird es nicht verarbeitet
}
//Return $content
return $content;
}
?>

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