[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 zu konfigurieren. ini, was uns eine sicherere Ausführung von PHP ermöglicht. 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 PHP-Dateien steuern kann Funktionen wie system(),
steuern auch die Berechtigungen vieler Dateioperationsfunktionen und lassen bestimmte Schlüsseldateien wie /etc/passwd, nicht zu
Aber die Standard-php.ini aktiviert den abgesicherten Modus nicht, wir schalten ihn ein:
safe_mode = on
(2) Benutzergruppensicherheit
Wenn „safe_mode“ aktiviert ist, ist „safe_mode_gid“ deaktiviert, dann kann das PHP-Skript auf die Datei zugreifen und dasselbe
Benutzer in der Gruppe
können ebenfalls auf die Datei zugreifen.
Es wird empfohlen, Folgendes einzustellen:
safe_mode_gid = off
Wenn Sie es nicht tun Wenn Sie es nicht festlegen, ist es möglicherweise nicht mehr möglich, Dateien im Verzeichnis unserer Server-Website zu bearbeiten, wenn wir beispielsweise
Dateien bearbeiten müssen.
(3) Home-Verzeichnis zum Ausführen von Programmen im abgesicherten Modus
Wenn der abgesicherte Modus aktiviert ist, es aber Zeit ist, bestimmte Programme auszuführen , Sie können das Home-Verzeichnis des auszuführenden Programms angeben:
safe_mode_exec_dir = D:/usr/bin
Unter normalen Umständen Da kein Programm ausgeführt werden muss, wird empfohlen, das Systemprogrammverzeichnis nicht auszuführen. Sie können auf ein Verzeichnis
verweisen und dann das auszuführende Programm kopieren , wie zum Beispiel:
safe_mode_exec_dir = D:/tmp/cmd
Ich empfehle jedoch, kein Programm auszuführen, dann können Sie darauf hinweisen zu unserem Webverzeichnis:
safe_mode_exec_dir = D:/usr/www
(4) Dateien im abgesicherten Modus einschließen
Wenn Sie bestimmte Dateien im abgesicherten Modus „Öffentliche Dateien“ einschließen möchten, ändern Sie die Optionen:
safe_mode_include_dir = D:/usr/www/include/
Tatsächlich im Allgemeinen in PHP-Skripten enthalten. Die Dateien werden alle im Programm selbst geschrieben, und dies kann entsprechend den spezifischen Anforderungen festgelegt 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. Damit verhindern Sie, dass PHP-Skripte auf
Dateien zugreifen, auf die nicht zugegriffen werden sollte, wodurch der Schaden von PHPShell bis zu einem gewissen Grad begrenzt wird. Wir können es im Allgemeinen 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 die Funktion „Verbot“ nicht erforderlich, wir ziehen sie jedoch aus Sicherheitsgründen in Betracht. Zum Beispiel:
Wir glauben nicht, dass wir PHP-Funktionen ausführen möchten, die Befehle ausführen können, einschließlich system() usw., oder
phpinfo() und andere Funktionen, dann können wir sie deaktivieren:
disable_functions = system, passhru, 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
Oben sind nur einige Dateiverarbeitungsfunktionen aufgeführt, die nicht häufig verwendet werden. Sie können die oben genannte Ausführungsbefehlsfunktion auch mit dieser Funktion kombinieren.
kann den meisten PHP-Shells widerstehen.
(7) Schließen Sie den Verlust von PHP-Versionsinformationen im http-Header
Um zu verhindern, dass Hacker an die PHP-Versionsinformationen gelangen Auf dem Server können wir die Informationsrampe im http-Header ausschalten:
expose_php = Off
Zum Beispiel, wenn ein Hacker Telnet www .12345.com 80, dann können Sie keine PHP-Informationen sehen.
(8) Registrierung globaler Variablen deaktivieren
Variablen, die in PHP übermittelt werden, einschließlich Variablen, die mit POST oder GET übermittelt werden, werden automatisch registriert Als globale Variable kann direkt darauf zugegriffen werden.
Dies ist für den Server sehr unsicher, daher können wir nicht zulassen, dass es als globale Variable registriert wird, also schalten wir das Register global aus Variablenoption:
register_globals = Off
Wenn dies festgelegt ist, müssen natürlich vernünftige Methoden verwendet werden, um die entsprechenden Variablen zu erhalten. Wenn Sie beispielsweise die von GET var übermittelten Variablen
abrufen, müssen PHP-Programmierer dies mit $_GET['var'] abrufen.
(9) Aktivieren Sie magic_quotes_gpc, um SQL-Injection zu verhindern
SQL-Injection ist in kleinen Fällen ein sehr gefährliches Problem eingedrungen, in schweren Fällen Der gesamte Server ist ausgefallen,
also seien Sie vorsichtig. Es gibt eine Einstellung in php.ini:
magic_quotes_gpc = Off
Dies ist standardmäßig deaktiviert Dem Benutzer werden automatisch SQL-Abfragen übermittelt,
, z. B. die Konvertierung von „ in „ usw., was eine wichtige Rolle bei der Verhinderung der SQL-Injection spielt. Daher empfehlen wir die Einstellung auf:
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 vor dem PHP-Skript
oder Fragen Sie SQL-Anweisungen und andere Informationen ab, nachdem sie Hackern zur Verfügung gestellt wurden. Daher wird allgemein empfohlen, dass Server Fehlermeldungen deaktivieren:
display_errors = Off
Wenn Sie aber Fehlerinformationen anzeigen möchten, müssen Sie den Grad des Anzeigefehlers festlegen, z. B. nur Informationen oberhalb der Warnung anzeigen:
error_reporting = E_WARNING & E_ERROR
Natürlich empfehle ich trotzdem, Fehlermeldungen auszuschalten.
(11) Fehlerprotokoll
Es wird empfohlen, die Fehlerinformationen nach dem Schließen von display_errors aufzuzeichnen, um das Auffinden des Grundes für den Serverbetrieb zu erleichtern:
log_errors = On
Legen Sie außerdem das Verzeichnis fest, in dem die Fehlerprotokolle gespeichert werden. Es wird empfohlen, die Root-Apache-Protokolle zusammen zu speichern:
error_log = D:/usr/local/apache2/logs/php_error.log
Hinweis: Die Datei muss den Apache-Benutzer zulassen und Gruppe, um Schreibrechte zu haben.
MYSQL-Berechtigungen herunterladen
Erstellen Sie einen neuen Benutzer wie mysqlstart
net user mysqlstart fuckmicrosoft /add
net localgroup users mysqlstart /del
gehört keiner Gruppe
Wenn MYSQL in d:mysql installiert ist, erteilen Sie mysqlstart die Vollzugriffsberechtigung
und legen Sie dann in den Anmeldeattributen diesen Benutzer mysqlstart fest Passwort eingeben, OK.
Starten Sie den MYSQL-Dienst neu, dann wird MYSQL mit niedrigen Berechtigungen ausgeführt.
Wenn Apache auf einer Windows-Plattform basiert, müssen wir auf eine Sache achten:
Das ist beängstigend. Dann lasst uns die Berechtigungen von Apache senken.
Net User Apache Fuckmicrosoft /add
Net Localgroup Users Apache /del
ok Wir haben eine Gruppe erstellt, zu der nichts gehört jede Gruppe userapche.
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,
Starten Sie den Apache-Dienst neu, ok, Apache wird mit niedrigen Berechtigungen ausgeführt.
Tatsächlich können wir auch die Berechtigungen jedes Ordners so festlegen, dass der Apache-Benutzer nur das ausführen kann, was er tun soll, und für jedes Verzeichnis ein separates Lese-/Schreibverzeichnis erstellen . der Benutzer.
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, dass jeder die Überprüfungen verstärkt, um SQL-Injection auf Chinesisch 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. Sie werden für die Verarbeitung von Einzelbyte-Zeichenfolgen verwendet. 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 muss 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, mysql_escape_string jedoch nicht.
Um es zusammenzufassen:
* addslashes() ist eine obligatorische Ergänzung;
* mysql_real_escape_string() bestimmt den Zeichensatz, aber für PHP-Versionsanforderungen;
* mysql_escape_string berücksichtigt nicht den aktuellen Zeichensatz der Verbindung.
-------------------------------------------------------- -------------------------------------------------- ------
Wenn Sie beim Codieren in PHP einige grundlegende Sicherheitsaspekte berücksichtigen, gehen Sie zunächst wie folgt vor:
Initialisieren Sie Ihre Variablen
Warum sagst du das? Schauen wir uns den folgenden Code an:
PHP-Code
if ($admin)
{
echo 'Anmeldung erfolgreich! ';
include('admin.php'); {
echo 'Sie sind kein Administrator und können nicht verwalten! „Welche Auswirkungen hat es, wenn ich einen unzulässigen Parameter einreiche?“ 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 vielleicht nicht, dann können auch einige sehr geheime Fehler dieses Problem verursachen. Es gibt zum Beispiel eine Lücke im PHPWind-Forum, die es uns ermöglicht Erhalten Sie direkt Administratorrechte. Dies liegt daran, dass eine $skin-Variable nicht initialisiert ist, 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
$admin = 0; // Variablen initialisieren
if ($_POST['admin_user'] && $_POST['admin_pass'])
{ Der entsprechende Verarbeitungscode gibt an, ob der Name und das Passwort korrekt sind. >
sonst 🎜 > {
echo 'Anmeldung erfolgreich! ';
include('admin.php'); {
echo 'Sie sind kein Administrator und können nicht verwalten! '; .php?admin=1 ist nicht einfach zu verwenden, da wir die Variable zu Beginn auf $admin = 0 initialisiert haben, dann können Sie durch diese Sicherheitslücke keine Administratorrechte erhalten.
2. SQL-Injection verhindern (SQL-Injection)
SQL-Injection sollte derzeit das schädlichste Programm sein, einschließlich der frühesten von ASP nach PHP, im Grunde alle inländischen Das Grundprinzip der in den letzten zwei Jahren populären Technologie besteht darin, einen Injektionspunkt zu bilden, indem die übermittelten Variablen nicht gefiltert werden, und es dann böswilligen Benutzern zu ermöglichen, einige SQL-Abfrageanweisungen zu übermitteln, was dazu führt, dass wichtige Daten gestohlen werden, Daten verloren gehen oder beschädigt werden oder dass es zu einem Angriff kommt in das Backend-Management.
Nachdem wir nun die grundlegenden Injektionsmethoden 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 Injektionsanweisung muss „Enthält“ sein Einige SQL-Anweisungen, da es keine SQL-Anweisungen gibt. Wie gehen wir vor? Es gibt vier Haupt-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 konstruieren:
PHP-Code
function inject_check($sql_str)
{
return eregi('select|insert|update|delete|'|
Funktion verify_id($id=null)
elseif (inject_check($id)) { exit('Die übermittelten Parameter sind illegal!'); } // Injektionsurteil
elseif (!is_numeric($id )) { exit('Der übermittelte Parameter ist illegal!'); } // Numerisches Urteil Der Programmcode lautet wie folgt:
PHP-Code
if (inject_check($_GET['id']))
{ exit( 'Die von Ihnen übermittelten Daten sind bitte illegal prüfen und erneut einreichen! '); 🎜> $id = verify_id($_GET['id']); Die übermittelten Daten sind legal. Bitte fahren Sie fort! „Was ist mit übermittelten Daten, großen Datenmengen?
Zum Beispiel können einige Zeichen der Datenbank schaden, wie zum Beispiel „_“, „%“. Diese Zeichen haben eine besondere Bedeutung. Was ist, wenn wir sie kontrollieren? Ein weiterer Punkt ist, dass, wenn magic_quotes_gpc = off in unserer php.ini, den übermittelten Daten, die nicht den Datenbankregeln entsprechen, nicht automatisch „“ vorangestellt wird. Dann müssen wir diese Probleme kontrollieren, also erstellen wir sie wie folgt:
PHP-Code ; // Filtern 🎜>
$str = str_replace("%", "%", $str); // '%' herausfiltern
return $str;
}
?>
Wir haben die Gefahr einer Serverkompromittierung erneut vermieden.
Erwägen Sie schließlich die Übermittlung einiger großer Datenmengen, z. B. zum Posten oder Schreiben von Artikeln oder Nachrichten. Wir benötigen einige Funktionen, die uns beim Filtern und Konvertieren helfen. Basierend auf den oben genannten Funktionen Funktion:
PHP-Code
$post = addslashes ($post); // Die übermittelten Daten filtern, wenn magic_quotes_gpc nicht geöffnet ist $post = str_replace("_", "_", $post); // '_' herausfiltern
$post = str_replace("%", "%", $ post); // ' % ' herausfiltern
$post = nl2br($post); // Konvertierung eingeben
$post= htmlspecialchars($ post); // HTML-Tag-Konvertierung 🎜> Haha, im Grunde haben wir an dieser Stelle über einige Situationen gesprochen. Tatsächlich habe ich das Gefühl, dass ich zumindest nur über zwei Aspekte gesprochen habe, und es gibt sehr wenig Inhalt Denken Sie über mehr darüber nach, einschließlich der PHP-Sicherheitskonfiguration, der Apache-Sicherheit usw., damit unsere Sicherheit als Ganzes integriert werden kann.
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