【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 Zum Beispiel müssen wir
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 des auszuführenden 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 Programm auszuführen, Dann können Sie 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 Dateien im abgesicherten 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 . Dies 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 den Zugriff von PHP-Skripten 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 ziehen es aber aus Sicherheitsgründen dennoch in Betracht. 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 dieser Informationen 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 Backend der Website 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,
Konvertieren Sie beispielsweise „ in „ usw., was eine wichtige Rolle bei der Verhinderung der SQL-Injection spielt. 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 verwendet werden, wenn (PHP 4 >= 4.3.0, PHP 5). 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
<?php if ($admin) { echo '登陆成功!'; include('admin.php'); } else { echo '你不是管理员,无法进行管理!'; } ?>
Okay, wir sehen, dass der obige Code normal zu laufen scheint und es kein Problem gibt. Was wird der Effekt sein? 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
<?php $admin = 0; // 初始化变量 if ($_POST['admin_user'] && $_POST['admin_pass']) { // 判断提交的管理员用户名和密码是不是对的相应的处理代码 // ... $admin = 1; } else { $admin = 0; } if ($admin) { echo '登陆成功!'; include('admin.php'); } else { echo '你不是管理员,无法进行管理!'; } ?>
Dann funktioniert es nicht, wenn Sie zu diesem Zeitpunkt http://daybook.diandian.com/login.php?admin=1 einreichen. weil wir es sind Wenn die Variable von Anfang an auf $admin = 0 initialisiert wird, können Sie über diese Sicherheitsanfälligkeit keine Administratorrechte erhalten.
2. Verhindern Sie SQL-Injection (SQL-Injection)
SQL-Injection sollte derzeit das schädlichste Programm sein, einschließlich der frühesten von ASP zu PHP, die in den letzten zwei Jahren im Grunde genommen beliebte Technologien waren Das Prinzip besteht darin, durch das Senden von Variablen ohne Filterung einen Injektionspunkt zu erstellen und es böswilligen Benutzern zu ermöglichen, einige SQL-Abfrageanweisungen zu senden, was dazu führt, 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-Code
<?php function inject_check($sql_str) { return eregi('select|insert|update|delete|'| function verify_id($id=null) { if (!$id) { exit('没有提交参数!'); } // 是否为空判断 elseif (inject_check($id)) { exit('提交的参数非法!'); } // 注射判断 elseif (!is_numeric($id)) { exit('提交的参数非法!'); } // 数字判断 $id = intval($id); // 整型化 return $id; } ?> 呵呵,那么我们就能够进行校验了,于是我们上面的程序代码就变成了下面的: PHP代码 <?php if (inject_check($_GET['id'])) { exit('你提交的数据非法,请检查后重新提交!'); } else { $id = verify_id($_GET['id']); // 这里引用了我们的过滤函数,对$id进行过滤 echo '提交的数据合法,请继续!'; } ?>
Okay, das Problem scheint hier gelöst zu sein, aber haben wir die per Post übermittelten Daten berücksichtigt? ? Was ist mit 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
<?php function str_check( $str ) { if (!get_magic_quotes_gpc()) // 判断magic_quotes_gpc是否打开 { $str = addslashes($str); // 进行过滤 } $str = str_replace("_", "\_", $str); // 把 '_'过滤掉 $str = str_replace("%", "\%", $str); // 把' % '过滤掉 return $str; } ?>
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
<?php function post_check($post) { if (!get_magic_quotes_gpc()) // 判断magic_quotes_gpc是否为打开 { $post = addslashes($post); // 进行magic_quotes_gpc没有打开的情况对提交数据的过滤 } $post = str_replace("_", "\_", $post); // 把 '_'过滤掉 $post = str_replace("%", "\%", $post); // 把' % '过滤掉 $post = nl2br($post); // 回车转换 $post= htmlspecialchars($post); // html标记转换 return $post; } ?>
Haha, im Grunde haben wir hier über einige Situationen gesprochen. Tatsächlich habe ich das Gefühl, dass ich sehr wenig gesagt habe, zumindest habe ich nur über zwei Aspekte gesprochen. Ich denke, wir werden beim nächsten Mal mehr über die gesamte Sicherheit sprechen, einschließlich der PHP-Sicherheitskonfiguration, der Apache-Sicherheit usw., damit unsere Sicherheit als Ganzes integriert werden kann und am sichersten ist.
Abschließend möchte ich Ihnen sagen, was oben ausgedrückt wurde: 1. Initialisieren Sie Ihre Variablen. 2. Denken Sie daran, Ihre Variablen zu filtern