Heim > Artikel > Backend-Entwicklung > So verhindern Sie die SQL-Injection in PHP
【1. Konfiguration auf der Serverseite】
Sicherheit, das Schreiben von PHP-Code ist ein Aspekt und die PHP-Konfiguration ist sehr wichtig.
Wir haben PHP manuell installiert. Die Standardkonfigurationsdatei von PHP befindet sich in /usr/local/apache2/conf/php.ini. Unser Wichtigstes ist, den Inhalt in php.ini zu konfigurieren, damit wir ihn ausführen können PHP sicherer. Die Sicherheitseinstellungen im gesamten PHP dienen hauptsächlich dazu, Angriffe durch PHPShell und SQL-Injection zu verhindern. Lassen Sie uns das langsam besprechen. Wir verwenden zunächst ein beliebiges Bearbeitungstool, um /etc/local/apache2/conf/php.ini zu öffnen. Wenn Sie es auf andere Weise installieren, befindet sich die Konfigurationsdatei möglicherweise nicht in diesem Verzeichnis.
(1) Aktivieren Sie den abgesicherten Modus von PHP
Der abgesicherte Modus von PHP ist ein sehr wichtiger integrierter Sicherheitsmechanismus, der einige Funktionen in PHP steuern kann, wie z. B. system(),
Gleichzeitig werden die Berechtigungen vieler Dateioperationsfunktionen kontrolliert und bestimmte Schlüsseldateien, wie z. B. /etc/passwd, sind nicht zulässig.
Die Standard-php.ini öffnet jedoch nicht Abgesicherter Modus. Wir schalten ihn ein:
safe_mode = on
(2) Benutzergruppensicherheit
Wenn Safe_Mode aktiviert ist, wird Safe_Mode_gid deaktiviert, dann das PHP-Skript können auf die Datei zugreifen, und Benutzer in derselben
-Gruppe können ebenfalls auf die Datei zugreifen.
Es wird empfohlen, Folgendes festzulegen:
safe_mode_gid = off
Wenn Sie es nicht festlegen, können wir die Dateien im Verzeichnis möglicherweise nicht bearbeiten Auf unserer Server-Website müssen wir beispielsweise
Bei der Bearbeitung von Dateien.
(3) Home-Verzeichnis zum Ausführen von Programmen im abgesicherten Modus
Wenn der abgesicherte Modus aktiviert ist, Sie aber bestimmte Programme ausführen möchten, können Sie das Home-Verzeichnis zum Ausführen des Programms angeben:
safe_mode_exec_dir = D:/usr/bin
Im Allgemeinen besteht keine Notwendigkeit, ein Programm auszuführen, daher wird empfohlen, das Systemprogrammverzeichnis nicht auszuführen. Sie können auf ein Verzeichnis verweisen,
und dann das Programm kopieren, das ausgeführt werden muss, zum Beispiel:
safe_mode_exec_dir = D:/tmp/cmd
Ich empfehle jedoch, kein anderes Programm als Sie auszuführen kann auf unser Webverzeichnis verweisen:
safe_mode_exec_dir = D:/usr/www
(4) Dateien im abgesicherten Modus einschließen
Wenn Sie einige öffentliche Dateien einschließen möchten Abgesicherter Modus, dann ändern Sie die Optionen:
safe_mode_include_dir = D:/usr/www/include/
Tatsächlich wurden die in PHP-Skripten enthaltenen Dateien im Allgemeinen im Programm selbst geschrieben kann je nach Bedarf eingestellt werden.
(5) Steuern Sie die Verzeichnisse, auf die PHP-Skripte zugreifen können
Verwenden Sie die Option open_basedir, um zu steuern, dass PHP-Skripte nur auf bestimmte Verzeichnisse zugreifen können, was verhindern kann, dass PHP-Skripte auf
sollten die abgerufenen Dateien den Schaden von phpshell bis zu einem gewissen Grad begrenzen. Wir können es generell so einstellen, dass nur auf das Website-Verzeichnis zugegriffen wird:
open_basedir = D:/usr/www
(6 ) Gefährliche Funktionen ausschalten
Wenn der abgesicherte Modus aktiviert ist, ist ein Funktionsverbot nicht erforderlich, wir erwägen dies jedoch aus Sicherheitsgründen. Zum Beispiel
haben wir das Gefühl, dass wir keine PHP-Funktionen ausführen möchten, einschließlich system(), die Befehle ausführen können, oder Funktionen wie
phpinfo(), die PHP-Informationen anzeigen können, dann wir Sie können sie deaktivieren:
disable_functions = system,passthru,exec,shell_exec,popen,phpinfo
Wenn Sie Datei- und Verzeichnisvorgänge deaktivieren möchten, können Sie viele Dateivorgänge deaktivieren
disable_functions = chdir,chroot,dir,getcwd,opendir,readdir,scandir,fopen,unlink,delete,copy,mkdir, rmdir,rename,file,file_get_contents,fputs,fwrite,chgrp,chmod,chown
Das Obige listet nur einige der häufig verwendeten Dateiverarbeitungsfunktionen auf. Sie können die oben genannte Ausführungsbefehlsfunktion auch mit dieser Funktion kombinieren
kann den meisten PHP-Shells widerstehen.
(7) Deaktivieren Sie den Verlust von PHP-Versionsinformationen im http-Header
Um zu verhindern, dass Hacker die PHP-Versionsinformationen auf dem Server erhalten, können wir den Verlust von PHP-Versionsinformationen deaktivieren Informationen im http-Header:
expose_php = Off
Wenn ein Hacker beispielsweise telnet www.12345.com 80, kann er die PHP-Informationen nicht sehen.
(8) Registrierung globaler Variablen deaktivieren
Variablen, die in PHP übermittelt werden, einschließlich Variablen, die mit POST oder GET übermittelt werden, werden automatisch als globale Variablen registriert und können direkt aufgerufen werden,
Dies ist für den Server sehr unsicher, daher können wir nicht zulassen, dass es als globale Variable registriert wird. Daher deaktivieren wir die Option „Globale Variable registrieren“:
register_globals = Off
Wenn es so eingestellt ist, müssen Sie natürlich angemessene Methoden verwenden, um die entsprechenden Variablen abzurufen, z. B. das Abrufen der von GET übermittelten Variablen var.
Dann müssen Sie $_GET['var'] verwenden Um es zu erhalten, sollten PHP-Programmierer darauf achten.
(9) Aktivieren Sie magic_quotes_gpc, um SQL-Injection zu verhindern
SQL-Injection ist ein sehr gefährliches Problem. Im kleinsten Fall wird das Website-Backend angegriffen, im schlimmsten Fall der gesamte Server bricht zusammen.
Also seien Sie vorsichtig. Es gibt eine Einstellung in php.ini:
magic_quotes_gpc = Off
Diese ist standardmäßig deaktiviert, wenn sie aktiviert ist, werden vom Benutzer übermittelte SQL-Abfragen automatisch konvertiert,
Zum Beispiel die Konvertierung von „ in „ usw. spielt eine wichtige Rolle bei der Verhinderung von SQL-Injection. Daher empfehlen wir die Einstellung:
magic_quotes_gpc = On
(10) Fehlermeldungssteuerung
Im Allgemeinen gibt PHP einen Fehler aus, wenn keine Verbindung zur Datenbank besteht oder unter anderen Umständen. Im Allgemeinen enthält die Fehlermeldung die Pfadinformationen des PHP-Skripts vor
oder der SQL-Anweisung der Abfrage Informationen werden dem Hacker zur Verfügung gestellt, ist unsicher, daher wird Servern generell empfohlen, Fehlermeldungen zu deaktivieren:
display_errors = Off
Wenn Sie Fehlermeldungen anzeigen möchten, stellen Sie sicher, dass dies der Fall ist Legen Sie den Grad der Anzeigefehler fest, z. B. nur die Anzeige der Warninformationen oben:
error_reporting = E_WARNING & E_ERROR
Natürlich empfehle ich trotzdem, die Fehleraufforderung auszuschalten.
(11) Fehlerprotokoll
Es wird empfohlen, die Fehlerinformationen nach dem Ausschalten von display_errors aufzuzeichnen, um das Auffinden des Grundes für den Serverbetrieb zu erleichtern:
log_errors = On
Gleichzeitig müssen Sie auch das Verzeichnis festlegen, in dem das Fehlerprotokoll gespeichert wird. Es wird empfohlen, das Root-Apache-Protokoll zusammen zu speichern:
error_log = D:/usr/local/apache2 /logs/php_error.log
Hinweis: Die Datei muss Schreibberechtigungen für den Apache-Benutzer und die Apache-Gruppe zulassen.
Führen Sie MYSQL mit reduzierten Berechtigungen aus
Erstellen Sie einen neuen Benutzer wie mysqlstart
net user mysqlstart fuckmicrosoft /add
net localgroup users mysqlstart /del
Gehört keiner Gruppe an
Wenn MYSQL in d:mysql installiert ist, dann geben Sie mysqlstart Vollzugriffsberechtigungen
Legen Sie dann die MYSQL-Dienstattribute im Systemdienst fest, im Anmeldeattribute Wählen Sie unter diesen diesen Benutzer mysqlstart aus, geben Sie dann das Passwort ein und bestätigen Sie.
Starten Sie den MYSQL-Dienst neu und dann wird MYSQL mit niedrigen Berechtigungen ausgeführt.
Wenn Apache auf einer Windows-Plattform basiert, müssen wir auf eine weitere Sache achten, die standardmäßig mit Systemberechtigungen ausgeführt wird.
Das ist beängstigend und führt dazu, dass sich die Leute sehr unwohl fühlen Wir geben Apache Reduzieren Sie die Berechtigungen.
net user apache fuckmicrosoft /add
net localgroup users apache /del
ok Wir haben einen Benutzer apche erstellt, der keiner Gruppe angehört.
Wir öffnen den Computermanager, wählen Dienste aus, klicken auf die Eigenschaften des Apache-Dienstes, wir wählen Anmelden, wählen dieses Konto aus, wir geben das oben erstellte Konto und Passwort ein,
Neustart Der Apache-Dienst, ok, Apache läuft mit niedrigen Berechtigungen.
Tatsächlich können wir auch die Berechtigungen jedes Ordners so festlegen, dass der Apache-Benutzer nur das ausführen kann, was wir von ihm möchten, und für jedes Verzeichnis einen separaten Benutzer mit Lese-/Schreibzugriff erstellen.
Dies ist auch eine beliebte Konfigurationsmethode, die von vielen virtuellen Hostanbietern verwendet wird. Diese Methode ist jedoch übertrieben, wenn sie verwendet wird, um dies zu verhindern.
[2. Schreiben in PHP-Code]
Obwohl sich viele inländische PHP-Programmierer immer noch auf Addslashes verlassen, um SQL-Injection zu verhindern, wird empfohlen, die chinesischen Prüfungen zu verstärken, um SQL-Injection zu verhindern. Das Problem mit Addslashes besteht darin, dass Hacker 0xbf27 verwenden können, um einfache Anführungszeichen zu ersetzen, während Addslashes nur 0xbf27 in 0xbf5c27 ändern, was zu einem gültigen Multibyte-Zeichen wird. 0xbf5c wird weiterhin als einfaches Anführungszeichen betrachtet, sodass Addslashes nicht erfolgreich abgefangen werden können.
Addslashes sind natürlich nicht nutzlos. Für die Verarbeitung von Einzelbyte-Zeichenfolgen verwenden Sie mysql_real_escape_string.
Zusätzlich für das Beispiel von get_magic_quotes_gpc im PHP-Handbuch:
if (!get_magic_quotes_gpc()) {
$lastname = addslashes($_POST['lastname']);
} else {
$ lastname = $_POST['lastname'];
}
Am besten überprüfen Sie $_POST[’lastname’], wenn magic_quotes_gpc bereits geöffnet ist.
Lassen Sie uns über den Unterschied zwischen den beiden Funktionen mysql_real_escape_string und mysql_escape_string sprechen:
mysql_real_escape_string kann nur unter (PHP 4 >= 4.3.0, PHP 5) verwendet werden. Andernfalls können Sie nur mysql_escape_string verwenden. Der Unterschied zwischen den beiden ist: mysql_real_escape_string berücksichtigt den aktuellen Zeichensatz der Verbindung, während mysql_escape_string dies nicht tut.
Um es zusammenzufassen:
* addslashes() ist ein erzwungener Zusatz;
* mysql_real_escape_string() bestimmt den Zeichensatz, es gibt jedoch Anforderungen für die PHP-Version;
* mysql_escape_string berücksichtigt nicht die aktuelle Zeichensatz der Verbindung.
--------------------------------- --- -------------------------------- ---
Wenn Sie beim Codieren in PHP einige grundlegende Sicherheitsaspekte berücksichtigen, gehen Sie zunächst wie folgt vor:
1. Initialisieren Sie Ihre Variablen.
Warum sagen Sie das? Schauen wir uns den folgenden Code an:
PHP-Code
if ($admin)
{ echo 'Anmeldung erfolgreich! ';
include('admin.php');
} }
else
{ echo 'Sie sind kein Administrator und können nicht verwalten! '; Zum Beispiel ist unsere Seite http://daybook.diandian.com/login.php, dann senden wir: http://daybook.diandian.com/login.php?admin=1, haha, denken Sie darüber nach, wir sind es Entweder Sie sind direkt Administrator, Sie verwalten es direkt.
Natürlich machen wir einen so einfachen Fehler nicht, und einige sehr geheime Fehler können dieses Problem auch verursachen. Beispielsweise gibt es im PHPWind-Forum eine Lücke, die es uns ermöglicht, direkt Administratorrechte zu erhalten Das $skin Die Variable ist nicht initialisiert, was später zu einer Reihe von Problemen führt. Wie vermeiden wir also die oben genannten Probleme? Beginnen Sie zunächst mit php.ini und setzen Sie register_global =off in php.ini. Dies bedeutet, dass nicht alle registrierten Variablen global sind, sodass dies vermieden werden kann. Wir sind jedoch keine Serveradministratoren und können ihn nur anhand des Codes verbessern. Wie können wir den obigen Code verbessern? Wir schreiben es wie folgt um:
PHP-Code 🎜> {
// Stellen Sie fest, ob der übermittelte Administrator-Benutzername und das Passwort korrekt sind.
// ...
$admin = 1; 🎜 > ';
include('admin.php');
} }
else
{ echo 'Sie sind kein Administrator und können nicht verwalten! '; Initialisieren Sie die Variable auf $admin = 0, dann können Sie durch diese Sicherheitslücke keine Administratorrechte erhalten.
2. SQL-Injection (SQL-Injection) verhindern
SQL-Injection dürfte derzeit das schädlichste Programm sein, einschließlich der frühesten von ASP bis PHP. Es ist im Grunde eine beliebte Technologie in China in den letzten zwei Jahren. Das Grundprinzip besteht darin, einen Injektionspunkt zu bilden, indem die übermittelten Variablen nicht gefiltert werden Wenn Sie böswilligen Benutzern dann ermöglichen, einige SQL-Abfrageanweisungen zu übermitteln, kann dies dazu führen, dass wichtige Daten gestohlen, verloren oder beschädigt werden oder in die Backend-Verwaltung eindringen.
Nachdem wir nun die grundlegende Injektionsintrusionsmethode verstanden haben, wie können wir sie verhindern? Wir sollten mit dem Code beginnen.
Wir wissen, dass es zwei Möglichkeiten gibt, Daten im Web zu übermitteln: eine ist Get und die andere ist Post. Daher beginnen viele gängige SQL-Injektionen mit der Get-Methode und die Injektionsanweisungen müssen einige SQL-Anweisungen enthalten Keine SQL-Anweisung, wie geht man vor? Es gibt vier wichtige SQL-Anweisungen: Auswählen, Aktualisieren, Löschen und Einfügen. Können wir diese Probleme vermeiden, wenn wir die von uns übermittelten Daten filtern?
Also verwenden wir reguläre Ausdrücke, um die folgende Funktion zu erstellen:
PHP. delete|'|.
function verify_id($id=null)
{ {
if (!$id ) {exit('Keine Parameter übermittelt!'); // Bestimmen Sie, ob es leer ist (inject_check($id)) {exit('Der übermittelte Parameter ist illegal!'); !is_numeric($id)) { exit('Der übermittelte Parameter ist illegal!'); } / / Numerische Beurteilung Die von Ihnen übermittelten Daten sind illegal, bitte überprüfen Sie sie und übermitteln Sie sie erneut!' ); gt;
Okay, das Problem scheint hier gelöst zu sein, aber haben wir die übermittelten Daten berücksichtigt? per Post und der großen Datenmenge?
Zum Beispiel können einige Zeichen der Datenbank schaden, wie z. B. „_“, „%“. Diese Zeichen haben eine besondere Bedeutung. Was ist also ein weiterer Punkt? Wenn magic_quotes_gpc = off in unserer php.ini ist, wird den übermittelten Daten, die nicht den Datenbankregeln entsprechen, nicht automatisch ein „“ vorangestellt. Daher müssen wir diese Probleme kontrollieren. Erstellen Sie daher die folgende Funktion:
PHP-Code 🎜> $str = addslashes($str); // Filter
} $str = str_replace("_", "_", $str); // Filtern Sie '_'
$str = str_replace( "%", "%", $str); // Herausfiltern ' % ' ?>
Wir haben die Gefahr einer Serverkompromittierung erneut vermieden.
Betrachten Sie abschließend die Situation beim Senden einiger großer Datenmengen, z. B. beim Posten oder Schreiben von Artikeln oder Nachrichten. Wir benötigen einige Funktionen, die uns beim Filtern und Konvertieren helfen. Basierend auf der obigen Funktion erstellen wir die folgende Funktion:
PHP-Code
{ if (!get_magic_quotes_gpc()) // Bestimmen Sie, ob magic_quotes_gpc geöffnet ist
{
$post = addslashes($post) ; // Gesendete Daten filtern, wenn magic_quotes_gpc nicht aktiviert ist post); // Konvertierung eingeben
$post= htmlspecialchars($post); // HTML-Tag-Konvertierung Ich habe das Gefühl, dass ich über sehr wenig gesprochen habe, zumindest habe ich nur über zwei Aspekte gesprochen, und es gibt sehr wenig Inhalt In Bezug auf die gesamte Sicherheit werde ich darüber nachdenken, beim nächsten Mal mehr darüber zu sprechen, einschließlich der PHP-Sicherheitskonfiguration, der Apache-Sicherheit usw. Die Sicherheit ist ein Ganzes und wir streben danach, am sichersten zu sein.
Abschließend möchte ich Ihnen sagen, was oben ausgedrückt wurde: 1. Initialisieren Sie Ihre Variablen. 2. Stellen Sie sicher, dass Sie Ihre Variablen filtern