Filsystemssäkerhet
Filsystemsäkerhet
Innehållsförteckning
PHP omfattas av säkerheten som är inbyggd i de flesta serversystem när det gäller behörigheter för filer och kataloger. Detta gör att du kan kontrollera vilka filer i filsystemet som kan läsas. Det är viktigt att vara försiktig med filer som är läsbara för alla användare för att säkerställa att de är säkra för läsning av alla som har tillgång till filsystemet.
Eftersom PHP är designat för att tillåta användarnivååtkomst till filsystemet, är det fullt möjligt att skriva ett PHP-skript som gör att du kan läsa systemfiler som till exempel `/etc/passwd`, ändra dina nätverksanslutningar, skicka massiva utskriftsjobb, osv. Detta har uppenbara konsekvenser, vilket innebär att du måste säkerställa att de filer som du läser från och skriver till är de rätta.
Överväg följande skript, där en användare anger att de vill ta bort en fil i sin hemmakatalog. Detta förutsätter en situation där ett PHP-webbgränssnitt regelbundet används för filhantering, så Apache-användaren är tillåten att ta bort filer i användarnas hemmakataloger.
Exempel #1 Dålig variabelkontroll leder till...
<?php // Ta bort en fil från användarens hemmakatalog $username = $_POST['user_submitted_name']; $userfile = $_POST['user_submitted_filename']; $homedir = "/home/$username"; unlink("$homedir/$userfile"); echo "Filen har tagits bort!"; ?>
Eftersom användarnamnet och filnamnet kan skickas via ett formulär, kan en användare skicka ett användarnamn och ett filnamn som tillhör någon annan, och ta bort det även om de inte borde ha rätt att göra det. I detta fall skulle du vilja använda någon annan form av autentisering. Tänk på vad som skulle kunna hända om de inskickade variablerna var "../etc/" och "passwd". Koden skulle då effektivt se ut så här:
Exempel #2 ... En filsystemattack
<?php // Tar bort en fil från var som helst på hårddisken som // PHP-användaren har tillgång till. Om PHP har root-åtkomst: $username = $_POST['user_submitted_name']; // "../etc" $userfile = $_POST['user_submitted_filename']; // "passwd" $homedir = "/home/$username"; // "/home/../etc" unlink("$homedir/$userfile"); // "/home/../etc/passwd" echo "Filen har tagits bort!"; ?>
Det finns två viktiga åtgärder du bör vidta för att förhindra dessa problem:
- Endast tillåta begränsade behörigheter till PHP-webbanvändaren.
- Kontrollera alla variabler som skickas in.
Här är ett förbättrat skript:
Exempel #3 Säkrare filnamnskontroll
<?php // Tar bort en fil från hårddisken som // PHP-användaren har tillgång till. $username = $_SERVER['REMOTE_USER']; // använder en autentiseringsmekanism $userfile = basename($_POST['user_submitted_filename']); $homedir = "/home/$username"; $filepath = "$homedir/$userfile"; if (file_exists($filepath) && unlink($filepath)) { $logstring = "Tog bort $filepath\n"; } else { $logstring = "Misslyckades med att ta bort $filepath\n"; } $fp = fopen("/home/logging/filedelete.log", "a"); fwrite($fp, $logstring); fclose($fp); echo htmlentities($logstring, ENT_QUOTES); ?>
Men även detta är inte utan sina brister. Om ditt autentiseringssystem tillåter användare att skapa egna användarinloggningar, och en användare väljer inloggningen "../etc/", är systemet återigen utsatt. Av denna anledning kan du föredra att skriva en mer anpassad kontroll:
Exempel #4 Ännu säkrare filnamnskontroll
<?php $username = $_SERVER['REMOTE_USER']; // använder en autentiseringsmekanism $userfile = $_POST['user_submitted_filename']; $homedir = "/home/$username"; $filepath = "$homedir/$userfile"; if (!ctype_alnum($username) || !preg_match('/^(?:[a-z0-9_-]|\.(?!\.))+$/iD', $userfile)) { die("Dåligt användarnamn/filnamn"); } // etc. ?>
Beroende på ditt operativsystem finns det en mängd olika filer som du bör vara bekymrad över, inklusive enheter (/dev/ eller COM1), konfigurationsfiler (/etc/ filer och .ini-filer), välkända filförvaringsområden (/home/, Mina dokument), osv. Av denna anledning är det vanligtvis enklare att skapa en policy där du förbjuder allt utom vad du uttryckligen tillåter.
Sidslut
Orginalhemsidan på Engelska :https://www.php.net/manual/en/security.filesystem.php
PHP
Det här är en maskinöversättning av PHP-manualen till svenska. Om du hittar fel är vi tacksamma om du rapporterar dem via formuläret som finns på
https://www.linux.se/kontaka-linux-se/
Tack till Datorhjälp som har sponsrat Linux.se med webserver.