Hur du förvärrar din PHP för bättre säkerhet
PHP används ofta bland många webbplatser & applikationer, men bör härdas för säkerhet. Här är några avancerade tips för att säkra din PHP-konfigurationsfil.
PHP är det överlägset mest populära programmeringsspråket för webb som används idag. Hittills över 80% av webbplatser med backend implementera PHP. WordPress, Joomla och Drupal stöds alla av det. Tyvärr har PHP blivit ett populärt mål för hackingförsök, varför det är viktigt att säkerställa konfigurationen. Följ dessa enkla steg för att härda din PHP-konfiguration och för att skydda den mot sårbarhet i hackningar.
Contents
- 1 Leta reda på PHP-konfigurationsfilen
- 2 php.ini struktur
- 3 Redigera konfigurationsinställningar
- 4 Avsnitt 1: Fjärranslutningar
- 5 Avsnitt 2: Inställningar för körning
- 6 Avsnitt 3: Inmatning av databegränsningar
- 7 Avsnitt 4: Felhantering
- 8 Avsnitt 5: Begränsa filåtkomst
- 9 Avsnitt 6: Filuppladdningar
- 10 Avsnitt 7: Säkerhetssession
- 11 Tvålcache
- 12 Starta om PHP
Leta reda på PHP-konfigurationsfilen
Namnet på konfigurationsfilen för PHP är php.ini, som du kommer att behöva redigera. Filens placering varierar beroende på ditt webbhotell och servertyp.
Om du inte är säker på var din php.ini-fil finns, kontakta din webbhotell. Vissa leverantörer kräver att du placerar PHP-inställningar i “.htaccess” -filen i webbroten. Om detta är fallet bör PHP-inställningar läggas till en per rad i formatet “php_value Name value”. Tänk på att din webbhotell kan förhindra att vissa inställningar ändras.
Redigera med en VPS eller dedikerad server
Web Host Manager (WHM) förenklar processen för redigering av PHP-konfigurationsfilen genom att tillhandahålla ett enkelt användargränssnitt. Hitta bara “Servicekonfiguration” i WHM och klicka på “PHP Configuration Editor”. Välj “Avancerat läge” på sidan som visas..
Om du inte använder en kontrollpanel som WHM, måste du öppna och redigera php.ini direkt. Platsen för php.ini kommer att variera baserat på serverns operativsystem. Många Linux-system placerar filen på sökvägen “/etc/php.ini”. Du kan bekräfta dess plats via kommandoraden. Börja med att logga in på servern via SSH (kontakta din webbhotell för instruktioner). När du är ansluten anger du kommandot “php –ini” och trycker på Enter. Sök efter raden med titeln “Loaded Configuration File” och notera filen php.ini.
Du kan öppna och redigera php.ini med hjälp av en textredigerare som körs inom kommandoraden, till exempel “nano” för Linux. Skriv bara “nano / path/to/php.ini” och tryck på Enter.
php.ini struktur
Inom php.ini placeras varje inställning på sin egen rad i formatet ”inställningsnamn = inställningsvärde”. Varje rad som börjar med en semikolon är en kommentar, så uppdatera inte någon av dessa rader.
Redigera konfigurationsinställningar
Nedan finns en lista över inställningar som bör granskas och uppdateras för att förbättra säkerheten. Inställningarna grupperas i flera avsnitt nedan baserat på deras syfte.
Avsnitt 1: Fjärranslutningar
allow_url_fopen = 0
allow_url_include = 0
Låt inte fopen wrappers öppna fjärradresser. Det går inte alltid att lita på fjärrinnehåll; inaktivera dessa alternativ garanterar att fopen-omslag bara kan ladda lokalt innehåll.
Avsnitt 2: Inställningar för körning
max_input_time = 30
max_execution_time = 30
Begränsa den maximala tid som tillåts för att bearbeta ingångar, såväl som den maximala tid som ett PHP-skript kan köras. Här är båda inställningarna inställda på en 30 sekunders gräns. Detta säkerställer att, om ett skript kompromitterades, det inte skulle läsa inmatningar eller köras under en längre tid. Ett välkodat skript bör inte kräva mer än 30 sekunder att köra.
minne_limit = 8M
Se till att ett PHP-skript aldrig använder mer än 8 MB minne. Om ett skript komprometteras begränsar denna inställning effektivt mängden minne som skriptet kan använda.
register_globals = av
Att inaktivera den här inställningen förbjuder effektivt att förfrågningsdata lagras automatiskt som en variabel. Att registrera globala variabler väcker flera problem; ett exempel är att miljövariabler enkelt kan modifieras. För att undvika dessa problem, se till att den här inställningen är avstängd.
expose_php = 0
Som standard exponeras närvaron av PHP och dess versionnummer som en del av HTTP-svar. Eftersom detta ger onödig insikt i servern, är det tillrådligt att stänga av den.
cgi.force_redirect = 1
Se till att PHP endast kan köras via en webbserveromdirigeringsregel. Detta förhindrar att PHP ringas direkt, vilket förbättrar säkerheten.
Avsnitt 3: Inmatning av databegränsningar
post_max_size = 256K
max_input_vars = 100
Hackare kan försöka översvämma webbapplikationsresurser genom att skicka massdata till det, vilket kan minska överföringshastigheter och tillgängliga serverresurser. Effekten av denna typ av attack kan minimeras genom att minska den maximala storleken på POST-data, och även genom att begränsa mängden begärningsdata. Observera att ”post_max_size” också påverkar den maximala storleken på filuppladdningar. om din applikation har filöverföringsfunktioner, se till att värdet på den här inställningen är minst lika stort som “upload_max_filesize”.
Avsnitt 4: Felhantering
display_errors = 0
display_startup_errors = 0
Felmeddelanden ska aldrig visas för slutanvändaren, eftersom meddelandena ofta innehåller detaljerad information om programmets kod och servern. Denna information kan potentiellt användas för att hjälpa hackare. Logga istället felmeddelanden till en säker fil på servern.
log_errors = 1
error_log = / home / johndoe / error_log
PHP-fel bör loggas för att felsöka applikationskoden och undersöka eventuella sårbarheter. Om du använder en filhanterare som den som ingår i cPanel, är en bekväm och säker plats för felloggen direkt utanför webbroten.
Avsnitt 5: Begränsa filåtkomst
open_basedir = "/ Home / JohnDoe / public_html"
Open_basedir ser till att PHP kan inkludera filer från endast de listade katalogerna. Detta förbättrar säkerheten genom att förhindra PHP-skript från oavsiktligt åtkomst till säkra filer utanför de vita listade banorna. Observera att du måste lägga till alla kataloger som PHP behöver för att komma åt vitlistan, inklusive de tillfälliga filöverförings- och sessionskatalogerna (se nedan). Du kan lägga till flera kataloger i listan genom att placera en kolon mellan varje katalog. Till exempel:
open_basedir = "/ Home / JohnDoe / public_html: / var / lib / php / tmp_upload: / var / lib / php / session"
Avsnitt 6: Filuppladdningar
file_uploads = 0
Om din ansökan inte innehåller funktionalitet för att ladda upp filer från användares datorer rekommenderas det att du inaktiverar denna PHP-funktion helt. Detta hjälper till att förhindra hackare att ladda upp skript som sedan kan injiceras i applikationen.
file_uploads = 1
upload_max_filesize = 1M
Om din ansökan kräver filöverföringsfunktioner ska du hålla “upload_max_filesize” till ett så litet värde som möjligt.
upload_tmp_dir = / var / lib / php / tmp_upload
Som standard placeras tillfälliga filuppladdningar i en katalog som är skrivbar av alla systemanvändare. Platsen bör bytas till en säkrare katalog. Se till att den nya katalogplatsen inte finns inom webbroten. Om du använder en filhanterare som den som ingår i cPanel är en enkel och säker plats för att skapa uppladdningskatalogen direkt utanför webbroten (dvs. samma katalog som public_html finns i). En annan säker plats är att skapa katalogen i PHP-katalogen i “/ var / lib”. Vägen beror på operativsystemet, dvs. “/ var / lib / php” eller “/ var / lib / php5”. Om open_basedir-begränsningar gäller, se till att den tillfälliga uppladdningskatalogen ingår i open_basedir-vitlistan.
Avsnitt 7: Säkerhetssession
Sessioner används för att bevara information över flera förfrågningar för enskilda användare. Den faktiska informationen lagras på servern och en cookie (eller, mindre säkert, HTTP-förfrågningsdata) som innehåller ett session-ID används för att validera användare. Sessioner används för syften inklusive autentisering i en webbapplikation, vilket är en anledning till att dess säkerhet är så viktig. Följande inställningar kan uppdateras för att minska risken för sessionupptagning.
session.use_strict_mode = 1
Skapa ett nytt session-ID om webbläsaren skickar ett tidigare oinitialiserat ID. Detta hjälper till att förhindra en attack som kallas session fixering.
session.cookie_httponly = 1
Låt sessionskakan endast vara tillgänglig från en HTTP-begäran och inte från andra källor som JavaScript. Detta hjälper till att förhindra en attack som kallas en XSS-attack.
session.use_cookies = 1
session.use_only_cookies = 1
session.use_trans_sid = 0
Spara session-ID i en cookie, snarare än att skicka det som en URL-parameter. Detta hjälper till att hålla en användares session säker genom att förhindra sessionfixeringsattacker.
session.name = custom_session_id
Cookies lagrar sin information i nyckelvärdesformat. Det rekommenderas att uppdatera standardnyckelnamnet på cookien som lagrar session-ID. Uppdatera “custom_session_id” med ett anpassat värde.
session.cookie_secure = 1
Om din webbapplikation kör över HTTPS-protokollet för säkerhet, aktivera den här inställningen för att tvinga cookies som innehåller session-ID endast åtkomst över en säker anslutning.
session.referer_check = example.com
Kontrollera var begäran kom ifrån för att avgöra om du vill tillåta åtkomst till sessiondata. Uppdatera detta inställningsvärde till din applikations domännamn för att förhindra att sessioninformation får åtkomst om ett skript laddas från en extern källa.
session.save_path = "/ Var / lib / php / session"
Standard sparingsväg för sessionsfilen är skrivbar av alla systemanvändare. Platsen bör bytas till en säkrare katalog. Se till att den nya katalogplatsen inte finns inom webbroten. Om du använder en filhanterare som den som ingår i cPanel, är en enkel plats att skapa sessionskatalogen direkt utanför webbroten (dvs. samma katalog som public_html finns inom). En annan säker plats är att skapa katalogen i PHP-katalogen i “/ var / lib”. Vägen beror på operativsystemet, dvs. “/ var / lib / php” eller “/ var / lib / php5”. Om open_basedir-begränsningar är i kraft, se till att sessionens sparingsväg ingår i open_basedir-vitlistan.
session.hash_function = sha512
SHA-512 är en säkrare hashalgoritm för att skapa session-ID jämfört med standardfunktionen MD5-hash. Denna algoritm är tillgänglig i PHP version 5.3+. Om du kör en mindre version av PHP, använd SHA1-hashalgoritmen istället. För att göra det ställer du in “session.hash_function = 1”.
session.bug_compat_42 = 0
session.bug_compat_warn = 0
Att inaktivera dessa inställningar kommer att säkerställa att sessionvariabler inte kan initialiseras globalt, vilket förbättrar säkerheten.
Inaktivera sårbara funktioner
disable_functions = ini_set, php_uname, getmyuid, getmypid, passthru, läcka, lyssna, diskfreespace, tmpfile, länk, ignore_user_abord, shell_exec, dl, set_time_limit, exec, system, highlight_file, source, show_source, fpaththru, virtual_posex posix_geteuid, posix_getgid, posix_getgrgid, posix_getgrnam, posix_getgroups, posix_getlogin, posix_getpgid, posix_getpgrp, posix_getpid, posix, _getppid, posix_getpwnam, posix_getpwuid, posix_getrlimit, posix_getsid, posix_getuid, posix_isatty, posix_kill, posix_mkfifo, posix_setegid, posix_seteuid, posix_setgid, posix_setpgid, posix_setsid, posix_setuid, posix_times, posix_ttyname, posix_uname, proc_open, proc_close, proc_get_status, proc_nice, proc_terminate, phpinfo, popen, curl_exec, curl_multi_exec, parse_ini_file, allow_url_fopenär, allow_url_include, pcntl_exec, chgrp, chmod, chown, lchgrp, lchown, putenv
Flera PHP-funktioner kan tillhandahålla öppna dörrar för webbapplikationshack om de inte används noggrant. Att till exempel skicka felaktigt validerade ingångar till många av dessa funktioner resulterar i säkerhetsproblem. Att inaktivera dessa funktioner helt och hållet är en enkel och effektiv lösning på problemet. Men om din applikation kräver någon av de funktioner som anges, ta bort den från listan.
Tvålcache
soap.wsdl_cache_dir = / var / lib / php / soap_cache
Liksom med filuppladdningar och sessiondata, bör SOAP-cache-data inte lagras i den tillfälliga standardkatalogen. Ställ in detta till en säkrare katalog.
Starta om PHP
När du har gjort ändringar i filen php.ini måste du starta om webbservern. WHM har en knapp för att starta om servern efter redigering av filen. Om du inte använder en kontrollpanel som WHM, måste du starta om servern via kommandoraden. För Apache anger du kommandot “sudo apachectl graciös” och trycker på Enter.
Slutsats
Genom att uppdatera dessa inställningar fortsätter din PHP-miljö att vara skyddad från hackförsök. Att skydda din PHP-miljö från hackare är ett viktigt steg för att skydda ditt företags rykte. Tänk dock på att en dåligt kodad applikation alltid är en öppen dörr till hacks, även med en härdad PHP-konfiguration. Börja med att hålla din konfiguration hård, och skriv därifrån alltid säker applikationskod.