Webprogrammering MySQL og PHP Sikkerhet
I dag Noen sikkerhetsaspekter Gjennomgang av kode Jobbe med oblig 2 Kryptering av passord Innlogging / sjekk SQL injection Gjennomgang av kode Jobbe med oblig 2 Prosjektet er lagt ut Ingen egen ukeoppgave
Bruk av passord Bør kryptere passordet i databasen Bruker en såkalt hash-funksjon Lager en kryptert string av en annen string MYSQL funksjon : PASSWORD Eks : PASSWORD(”Hei og hopp”); *633583B61FDBB58177D561105AED377DA821A0CE For sjekk må passordet inn også ”hash’es”
Bruk av passord forts. If() Database Legge inn passordet: Sjekke passordet: PASSWORD(”Hei og hopp1”); PASSWORD(”Hei og hopp”); *21A9A0A6D7968C641B451D49BE4F502562CE070D *633583B61FDBB58177D561105AED377DA821A0CE If() Sjekk om samme hash 40 hex-byte *633583B61FDBB58177D561105AED377DA821A0CE Database INSERT SELECT
Sette inn passord <?php include "sql-connect-inc.php"; $passord="Hei og hopp"; $sql = "UPDATE ansatt SET Passord = PASSWORD('$passord') WHERE Fornavn = 'Varg'"; if(mysql_query($sql)) { echo '<br/>* Passordet er lagt inn *<br/>'; } else echo mysql_error();
Sjekke passord <?php include "sql-connect-inc.php"; $sjekk_passord="Hei og hopp"; $sql = "SELECT * FROM ansatt WHERE (Fornavn = 'Varg') AND (Passord = PASSWORD('$sjekk_passord'))"; $resultat = mysql_query($sql); $antall = mysql_num_rows($resultat); if ($antall == 1) { echo "Passordet er korrekt"; } else echo "Passordet er ikke korrekt!";
Sesjonsvariabel for innlogging <?php session_start(); include "sql-connect-inc.php"; $sjekk_passord=$_REQUEST[passord]; $sql = "SELECT * FROM ansatt WHERE (Fornavn = 'Varg') AND (Passord = PASSWORD('$sjekk_passord'))"; $resultat = mysql_query($sql); $antall = mysql_num_rows($resultat); if ($antall == 1) { $_SESSION[”loggetInn”]=true; } else $_SESSION[”loggetInn”]=false;
På hver side ved innlogging <?php session_start(); If (!$_SESSION[”loggetInn”]) { echo ”Du er ikke logget på ! Trykk her for å logge på :”; echo ” <a href="loginn.php">Tilbake</a>”; die(); } // legges inn i include som legges først i alle sidene // Her kommer koden for hva som skal skje dersom man er innlogget
Alternative hash-funksjoner Password funksjonen er en MySQL funksjon og har en lengde på 40 hex-tegn. Enkel å bruke når passord skal lagres i databasen Dersom hash skal lagres på fil må det brukes en php-funksjon md5(”string”); Denne har en lengde på 32 hex-tegn
Alternative hash-funksjoner Men MD5 har en forholdsvis kort hash Alternativt sha1 som har en 40 char hex hash Kan bruke den generelle hash-funksjonen i PHP for å lage lengre hash’er Hash(”algoritme”, ”string”); Algoritme kan være f.eks sha256 : 64 char hex sha512 :128 char hex
SQL injection Sikre at ingen kan skrive inn noe skadelig kode i input-felt -- betyr kommentar i SQL Eks: SELECT * FROM Kunde WHERE navn = ’Tor’ - - her er en kommentar
SQL injection Eks, gitt sjekk for passord: SELECT * FROM bruker WHERE navn = ’$_REQUEST[navn]’ AND passord = ”fd6574b”; Hva skjer dersom vi i navnefeltet skriver et kjent navn: Ola’- - _ (mellomrom tilslutt) SELECT * FROM bruker WHERE navn = ’Ola’ - - _’ Passordet har da ingen ting å si (kommentert ut)
SQL injection i PHP Dette kan unngås ved å legge ”escape-tegn” ved enkelt og dobbelt fnutter før select-setninger. F.eks bruk funksjonen: $navnEsc= mysql_escape_string ($_REQUEST[’navn’]); SELECT * FROM bruker WHERE navn = ’$navnEsc’ AND passord = ”fd6574b”; Resultat: Input : Ola’- - SELECT * FROM bruker WHERE navn = ’Ola\’ - -’ AND passord = ”fd6574b”;
Magic quotes En annen måte er å sette dette i PHP ved hjelp av ”Magic quotes”. Da blir fnutter automatisk ”escapet” med \ (dvs. ’ blir \’). Denne muligheten kom i PHP versjon 4.0.0 Versjon 5.2.6 med Magic quotes kjøres på cube (default i php.ini). Tas vekk i versjon 6.0.0! Dvs. ikke sats på Magic quotes!
Magic quotes Funksjon for å sjekke om denne er satt i PHP.INI get_magic_quotes_gpc() (returnerer true/false) Eksempel: if(!get_magic_quotes_gpc()) { $Fornavn= mysql_escape_string($_REQUEST['fornavn']); } else $Fornavn = $_REQUEST['fornavn']; echo $Fornavn;
Fnutter ved tall Bruk fnutter også ved tall: Her er alder et heltall i databasen. Skriver vi inn ”23 - -” for alder får vi Bruk isteden : Da vil tallet håndteres som en string! Og det godtas av databasesystemet (konverterer til heltall) $sql = "DELETE * FROM Ansatt WHERE fornavn = '$_REQUEST[Input]' AND alder > $_REQUEST[Alder] AND passord = 'dskfgj4905'"; DELETE * FROM Ansatt WHERE fornavn = ‘Ole‘ AND alder > 23 - - AND passord = = ‘dskfgj4905’ $sql = "DELETE * FROM Ansatt WHERE fornavn = '$_REQUEST[Input]' AND alder > ‘$_REQUEST[Alder]’ AND passord = 'dskfgj4905'";
Unngå SQL injection: Ved input bruk : mysql_escape_string(); $db->escape_string(); (MySQLi) Ikke sats på at Magic Quotes er satt Sjekk med get_magic_quotes_gpc() Bruk fnutter også ved tall!
SQL injection Ref: www.xckd.com