PHP Säkerhet & Optimering tobias.landen@chas.se se
Att läsa om ämnet Bra och kortfattad tt dbok: Essential Php Security Författare: Shiflett, Chris Antal sidor: 124 Förlag: O'Reilly ISBN 10: 059600656X http://phpsecurity.org/ http://phpsec http://phpsec.org/ The PHP Security Consortium
Learning PHP & MySQL I kursboken Learning PHP & MySQL kan du även läsa kapitel 15 för att få lite grundläggande insikt i hur man jobbar med säkerhet i PHP.
Grundläggande inställningar i PHP Register Globals Ska vara avstängt Error Reporting Ska vara avstängt Skapa gärna en egen error hanterare som lagrar fel i till exempel en DB
Grundläggande utvecklingsregler g
Regel 1: Defense in Depth Bygg så många lager av säkerhet som möjligt. Ha två fallskärmar med dig när du hoppar. Eller kanske k tre
Regel 2: Least Privilege Så lite rättigheter som möjligt till varje roll i systemet
Regel 3: Simple Is Beautiful Complication i breeds mistakes, and mistakes can create security vulnerabilities. Komplex kod: $search = (isset($_get['search'])? $_GET['search'] : ''); Mindre komplex kod: $search = ''; if (isset($_get['search'])) { $search = $_GET['search']; }
Regel 4: Minimize Exposure Visa inte känslig data i klartext Till exempel skriva ut password efter en registrering Skicka inte känslig data i klartext SSL
Utövande
Balance Risk and Usability Hög säkerhet medför oftast sämre användarvänlighet
Track Data Håll koll kllpå var data kommer ifrån och vart du skickar den $_POST $_GET $_SESSION $_COOKIE Echo mysql_query() med mera
Filter Input Identifiera inputen Filtrera inputen Holl koll på vilken data du filtrerat och inte
Escape Output Identifiera output Escaping output Hålla koll på escaped och unescaped data
De stora bitarna i PHP säkerhet Forms & URL Databaser & SQL SESSIONS och COOKIES Includes Jobba mot filsystemet (filer och kommandon) Authentication & Authorization Delad hosting Använda färdig kod
Forms & URL Tänk på användande av GET och POST GET sparas i historiken Båda kan infekteras
File Uploads Akta för körara filer/script Risk att fel fil flyttas runt på disken Verifiera först att det är en uppladdad fil Kontrollera att filen flyttas till rätt ställe
Cross Site Scripting Om användarens inmatde text skrivs ut direkt på skärmen kan de skicka med farlig javascriptkod Cross Site Request Forgeries Skicka data till en website utanför samma domän Till exempel <img src="http://store.example.org/buy.php?item= e org/b php?item pencil&quantity=50" />
Tänk på att användaren alltid kan skicka en GET, POST eller annan HTTP data som han/hon vill. Det betyder att även om du inte har ett vist val i ditt formulär kan användaren mata in det
Databaser och SQL SQL Injections Om data som användaren matat in stoppas rakt in i en SQL fråga man användaren ändra logiken och komma åt känslig data: $sql = SELECT count(*) () FROM users WHERE username = '{$_POST['username']}' AND password = '{$_POST[ password']}' "; $ l $sql = SELECT * FROM users WHERE username = 'myuser' or 'foo' = 'foo' ANDpassword = mypassword "; Lös detta med mysql_real_escape_string()
Känslig data i databasen är inte bra Kryptera att data som är känslig utifall någon skulle komma åt databasen eller få tag i en backup
SESSIONS & COOKIES Tänk på att SESSIONS och COOKIES kan bli stulna av en annan användare K dik ill l k l Kan undvikas genom att till exempel koppla en SESSION till ett IP nummer eller en specifik browser version eller kanske båda.
Includes Skilj på include() och require() Namnge inte include filer med annan filändelse l än.php Se till att undvika dynamiska/variabla filnamn i en include
Jobba mot filsystemet (filer och kommandon) Var försiktig med användar inmatade sökvägar. Tänk på att man kan mata in../ som tar en upp en nivå. Tänk på att man kan mata in externa sökvägar till andra servrar Om man kör kommandon mot servern via PHP ska man vara extra försiktig. Kontrollera vilket kommando som kommer köras
Authentication & Authorization Brute force attacks Användaren kan försöka skicka randomiserade inloggningar mot webbtjänsten. Logga hur många felaktiga försök som gjorts och blocka efter ett par stycken.
Password sniffing All POST data skickas i klartext även om man tar <input type= password /> Skicka data över SSL (https) för att få en krypterad överföring.
Persistent Logins Funktion för att komma ihåg en användare så att man slipper logga in varje gång Bör undvikas eftersom det blir enklare för en hacker att sno en användares login
Delad hosting Exposed Source Code Som det är på jedu.se just nu Om till exempel MySQL lösenord lagras i en fil i stil med db.php kan en annan användare komma åt lösenordet. Om man kan bör dessa läggas i environment variables Om man kan bör dessa läggas i environment variables som läses in av webbservern
Exposed Session Data SESSIONS lagras i /tmp som är en mapp som alla användare på en server kan komma åt En hacker kan även i teorin byta ut data i en specifik session så at de till exempel får större rättigheter En bättre lösning är att lägga SESSIONS i databasen Man kan bygga en egen session handler
Filsystemet På många webbservrar så kan man navigera runt fritt i filstrukturen De flesta bra webbhotellen stänger in varje användare
Använda färdig kod Kontrollera alltid kd kod ni inte själva byggt Om ni inte har möjlighet att läsa igenom hela koden gå igenom resurser på nätet och se vad folk tycker Tänk på att det alltid kan finnas hål håll utkik efter nya versioner av koden och uppdatera Sänk aldrig säkerheten i er egen kod för att få annan kod att fungera Tänk på att detta även gäller för APIer och Web Services
Optimering av PHP
Benchmarking Mät vad som är mest effektivt Som att starta och stoppa ett tidtagarur Sen är det bara att hitta den effektivaste lösningen $benchmark[ start ] = microtime() Kod som ska mätas $benchmark[ end ] = microtime() Tidsåtgång = $benchmark[ start ] $benchmark[ end ]
Olika problemområden
Variabler Deklarera inte variabler i onödan Det kan allokera onödigt mycket minne
echo Kör en echo itälltfö istället för många Bra exempel: echo ; <div> $name </div> Dåligt exempel: echo <div> ; echo $name; echo </div> ;
Loopar Kolla igenom alla loopar i er kod och se till att: De inte kör för många varv i onödan Inte två loopar gör samma sak två gånger Ex: stoppar in allt i en array och sedan matar ut det igen
Databaskopplingar Låt databasen göra så mycket jobb som möjligt jg Men ställ frågor till den så sällan som möjligt Ta bara ut just den data du behöver l d h l b kl d Limitera antal rader och välj bara kolumner du behöver i PHP koden
Includes Inkludera bara kod, funktioner och klasser som du kommer använda under körningen
Funktioner Använd funktioner för att återbruka kod
Obejktorientering Överväg om det lönar sig Framförallt i mindre projekt
Spara på förfrågningar Gör så mycket som möjligt i frontend (JavaScript) Spara genererade sidor som HTML filer om det går Spara dtb databasanrop i PHP om dt det går
Allt handlar om avvägningar