Mit der Entwicklung des Internets nehmen PHP-basierte Websites immer noch eine große Anzahl von Anwendungsszenarien ein. Aufgrund der Flexibilität und Beliebtheit von PHP können unsichere Schreibmethoden leicht von Angreifern ausgenutzt werden. In diesem Artikel werden die Verwendungsmethoden und Abwehrideen mehrerer häufiger Schwachstellen aus praktischer Sicht vorgestellt und der Beispielcode zum leichteren Verständnis und zur Reparatur beibehalten (die Codeblöcke bleiben so weit wie möglich erhalten und nur die verwirrende HTML-Struktur wird bereinigt). Informationen zur Website-Werbung oder interne Links wurden aus dem Artikel entfernt.
Beschreibung: Angreifer fügen bösartige SQL-Fragmente in die Eingabe ein und ändern die ursprüngliche Abfragelogik, um die Überprüfung zu umgehen oder Daten zu stehlen/zu manipulieren.
<?php
$id = $_GET['id'];
// Spleißen SQL Abfrageanweisung
$sql = "SELECT * FROM users WHERE id = " . $id;
// Abfrage ausführen
$result = mysqli_query($conn, $sql);
// Abfrageergebnisse verarbeiten
// ...
?>Problem: Durch das direkte Zusammenfügen von Benutzereingaben wird die Anweisung manipuliert. Wenn Sie beispielsweise id=1 ODER 1=1 übergeben, ist die Bedingung immer wahr, was zu einem Verlust vertraulicher Daten oder einer Umgehung der Authentifizierung führen kann.
Schutzvorschläge: Verwenden Sie parametrisierte Abfragen (vorverarbeitete Anweisungen) oder ORM, um ein direktes Zusammenfügen von Benutzereingaben zu vermeiden. Führen Sie eine Typüberprüfung der Eingabe durch (stellen Sie beispielsweise sicher, dass die ID eine Ganzzahl ist). Behandeln Sie Fehlermeldungen angemessen, um zu verhindern, dass interne Details preisgegeben werden.
Beschreibung: Wenn der Pfad, der Dateien enthält, nicht streng kontrolliert wird, kann ein Angreifer einen speziell gestalteten Pfad übergeben, um jede beliebige Datei einzuschließen, sogar eine Remote-Datei (sofern die Konfiguration dies zulässt), was zur Offenlegung sensibler Dateien oder zur Remote-Codeausführung führt.
<?php
$page = $_GET['page'];
// Spleißen文件路径并包含文件
include("pages/" . $page . ".php");
?>Problem: Es gibt keine Einschränkung für den Seitenparameter . Ein Angreifer kann über einen Pfad wie page=../config auf die sensible Konfiguration des übergeordneten Verzeichnisses zugreifen oder diese nach dem Hochladen der Datei mithilfe eines Skripts ausführen.
Schutzvorschläge: Pfade von Benutzern nicht direkt einbeziehen; Verwenden Sie einen Whitelist-Mechanismus, um die Dateinamen zu begrenzen, die aufgenommen werden können. Verwenden Sie ein Basisverzeichnis und lösen Sie den Pfad vor der Aufnahme in einen absoluten Pfad auf und überprüfen Sie, ob er innerhalb des zulässigen Bereichs liegt. Deaktivieren Sie PHP-Konfigurationsoptionen, die eine Remote-Einbindung ermöglichen (z. B. „allow_url_include“).
Beschreibung: Wenn die Datei-Upload-Funktion nur die Dateierweiterung oder den Dateinamen überprüft, kann ein Angreifer ein getarntes ausführbares Skript hochladen und es auf dem Server ausführen und dadurch höhere Berechtigungen erlangen.
<?php
$targetDir = "uploads/";
$targetFile = $targetDir . basename($_FILES["fileToUpload"]["name"]);
// Dateityp prüfen
$fileType = strtolower(pathinfo($targetFile, PATHINFO_EXTENSION));
if ($fileType != "jpg" && $fileType != "png" && $fileType != "jpeg" && $fileType != "gif") {
exit("Erlauben Sie nur das Hochladen von Bilddateien!");
}
// Dateien hochladen
if(move_uploaded_file($_FILES["fileToUpload"]["tmp_name"], $targetFile)) {
echo "Datei erfolgreich hochgeladen!";
} else {
echo "Das Hochladen der Datei ist fehlgeschlagen!";
}
?>Problem: Eine alleinige Beurteilung anhand der Dateierweiterung ist unzuverlässig. Angreifer können die Erweiterung ändern oder MIME-Typen fälschen, um schädliche Skripte hochzuladen.
Schutzvorschläge:
Sicherheit kann nicht in einem Arbeitsgang erreicht werden. Es wird empfohlen, während der Entwicklung sowie des Betriebs und der Wartung die folgenden Vorgehensweisen anzuwenden:
Dieser Artikel zeigt einige typische PHP-Sicherheitsprobleme und ihre Schutzideen. Es besteht die Hoffnung, dass Entwickler das Sicherheitsbewusstsein in jeden Aspekt der Anforderungen, des Designs, der Implementierung sowie des Betriebs und der Wartung integrieren können. Für jede Art von Schwachstelle im Beispiel kann die tatsächliche Umgebung komplexer sein. Es wird empfohlen, die Ergebnisse von Code-Audits, automatisierten Scans und Penetrationstests für gezielte Reparaturen zu kombinieren.