Hantera SQL Injections med PHP

söndag, september 28, 2008 | Inga kommentarer

Varje dag på Internet ökar antalet Internetanvändare. Enligt nya mätningar finns det ca 747 miljoner människor som nu kan koppla upp sig på Internet. Läs mer på Clickz.com

I och med att antalet användare ökar, medför att attacker mot hemsidor och webbapplikationer också ökar. Man hör om attacker mot hemsidor som fått nytt innehåll eller där användaruppgifter stulits. Hur man kommit över data kan bero på många orsaker, men ett vanligt fel är att man gjort misstag i koden och inte skyddad sig mot säkerhetsproblemet SQL Injections.

Vad är SQL Injections?
SQL Injection innebär att man kan manipulera databasen genom att indata från formulär eller data från querysträngen ändras och som i sin tur påverkar SQL frågan. Har man inte hanterat indatan från formuläret eller datan från querysträngen på rätt sätt kan det orsaka stor skada. Känslig data kan raderas eller spridas.

Exempel på SQL Injections?
SQL Injections kan utföras så fort det finns formulär på hemsidan, tex inloggningsformulär, sökformulär. Tänkte visa hur man på ett enkelt sätt kan logga in på en webbplats där man inte skyddat sig mot SQL Injections. När man postar formuläret tas uppgifterna användarnamn och lösenord emot på sidan för att sedan läggas till SQL-frågan:

1
2
3
4
5
6
$user = $_POST['txtUser']; //Innehåller datat "kalle"
$pass = $_POST['txtPass']; //Innehåller datat "kula"
 
//Indatan som infogas i SQL-frågan
$sql = "SELECT * FROM users WHERE
username = '".$user."' AND password = '".$pass."'";

Datan som skickas till databasen ser ut som följer. Finns användarnamnet och lösenordet loggas man in.

1
2
3
//Indatan som infogas i SQL-frågan
SELECT * FROM users WHERE username = 'kalle'
AND password = 'kula';

Säg nu att vi kommer till webbplatsen och tänker utföra en SQL Injection. Eftersom vi i exemplet inte skyddat indatat ska vi ersätta lösenordet med följande data.

1
2
//En typisk SQL Injection
' OR '1' = '1

Vår SQL-fråga blir nu istället.

1
2
3
//Indatan som infogas i SQL-frågan
$sql = "SELECT * FROM users WHERE username = 'kalle'
AND password='' OR '1' = '1'";

Denna SQL-fråga skickas till databasen. Kollar ifall användaren finns. Besökaren loggas in och kan hämta skyddad data, radera eller ändra data.

Hur skyddar man sig mot SQL Injections?
För att skydda sig måste man hantera indatan från formuläret innan de skickas till MySQL-databasen. För att hantera indatan kan man använda sig av funktionen mysql_real_escape_string. Funktionen lägger till backslashes (\) för att escapa specialtecken som enkelfnuttar (’) och dubbelfnuttar (”) i SQL-frågan.

Innan du använder dig av denna funktion måste du vara ansluten till databasen (se mysql_connect).

1
2
3
4
//Hantera SQL Injection
$sql = "SELECT * FROM users WHERE username =
'".mysql_real_escape_string($user)."' AND password =
'".mysql_real_escape_string($pass)."'";

Datan som skickas till databasen ser ut som följer.

1
2
3
4
//mysql_real_escape_string har lagt till backslashes
//för att escapa enkelfnuttarna i SQL-frågan
SELECT * FROM users WHERE username = 'kalle'
AND password='\' OR \'1\' = \'1'

Om du alltid gör det till en vana och använder denna funktion i dina SQL-frågor så har du ett bra skydd mot SQL Injections.

Om du bygger webbapplikationer i annat språk som tex ASP och med annan databas (SQL Server), ta reda vad på som gäller för det språket och databasen.

Mer info:
Wikipedia

PHP.net (mysql_real_escape_string)

PHP Security Guide

Viktigt med säkerhet på din webbplats

lördag, maj 3, 2008 | Inga kommentarer

Man hör lite då och då om webbplatser som blivit attackerade på olika sätt, ibland har man kommit åt känsliga uppgifter, eller att webbsidor ändrat innehåll och utseende . Det sistnämda har nämligen hänt mig då man via ett formulär i gästboken skrivit in HTML-kod som ändrat utseendet på hemsidan.

Bygger man webbplatser med tekniker som PHP, ASP eller andra scriptspråk, finns det alltid en risk att scripten kan bli manipulerade på något vis. Därför är det viktigt för dig som tänker bygga en webbplats att du har kunskap om olika intrångsmetoder och hur du undviker dessa.

Jag tänkte visa på några vanliga problem samt hur man kan förhindra att hamna i fallgropparna genom att skriva säkrare kod gällande PHP applikationer.

Kommande inlägg kommer att handla om bla SQL injections, Cross-Site Scripting (XSS).