SQL-injections är en vanlig angreppsmetod mot databasdrivna
webbapplikationer. Det hela går ut på att mata in värden i t.ex. ett forumulär
som sedan körs mot databasen där en SQL-fråga är inbakad i strängen. I det här exemplet kommer vi gå igenom hur SQL-injections fungerar men även hur vi med funktionen mysq_real_escape_string kan skydda mot detta.
Om vi tänker oss att tabellen users innehåller detta: Och på deras sida går det logga in via ett forumlär: Under normala omständigheter loggar användare in på sidan
genom att fylla i användarnamn och lösenord som sedan kommer testas mot
databasen med en SQL-fråga. $sql i login.php kommer då se ut så här: SELECT * FROM users WHERE username='Haxx0r' AND password='' OR 42=42 AND username='macgyver' Vilket kommer resultera i att frågan går igenom.
<?php
include('dbconnect.php'); if(isset($_POST['username']) && isset($_POST['password'])) { //lägger till \ framför tecken som ' $username = mysql_real_escape_string($_POST['username']); $password = mysql_real_escape_string($_POST['password']); $sql = "SELECT * FROM users WHERE username='$username' AND password='$password'"; echo "<pre>$sql</pre>"; $result = mysql_query($sql); $num_result = mysql_num_rows($result); if($num_result > 0){ $user = mysql_fetch_assoc($result); echo "Hej $user[username] <br />"; echo "Du är allergisk mot: $user[allergy]"; }else{ echo "fel användarnamn eller lösenord"; } } ?> Ett intrångförsök som tidigare kommer alttså leda till att $sql ser ut så här: SELECT * FROM users WHERE username='Haxx0r' AND password='\' OR 42=42 AND username=\'macgyver'Vilketer leder till: "fel användarnamn eller lösenord" För mer läsning på ämnet se: http://www.swesecure.com http://www.unixwiz.net/techtips/sql-injection.html |
Databashantering > php >