180 likes | 335 Views
Webprogrammering. MySQL og PHP Sikkerhet. I dag. Noen sikkerhetsaspekter 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
E N D
Webprogrammering MySQL og PHP Sikkerhet
I dag • Noen sikkerhetsaspekter • 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. Legge inn passordet: Sjekke passordet: PASSWORD(”Hei og hopp1”); PASSWORD(”Hei og hopp”); *21A9A0A6D7968C641B451D49BE4F502562CE070D If() • *633583B61FDBB58177D561105AED377DA821A0CE 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 charhexhash • Kan bruke den generelle hash-funksjonen i PHP for å lage lengre hash’er • Hash(”algoritme”, ”string”); • Algoritme kan være f.eks • sha256 : 64 charhex • sha512 :128 charhex
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) • Ikkesatspå at Magic Quotes ersatt • Sjekkmed get_magic_quotes_gpc() • Bruk fnutter også ved tall!
SQL injection Ref: www.xckd.com