FAQ |
Kalender |
![]() |
#1 | ||
|
|||
Medlem
|
Jag håller på att bygga en fiskesajt som ska lagra inte särskilt känsliga uppgifter i en MySQL-databas. Det här med SQL injections vill jag minnas kan ställa till både det ena och det andra i mySQL-databaser, och därför undrar jag nu;
Hur genomförs en SQL injection, kan en bandit lägga till SQL-kod i mitt inmatningsformulär som sedan ställer till besvär i databasen? Vad kan SQL-injektioner ställa till med, kan de bara radera och förstöra eller även ta fram databasuppgifter åt banditen? Finns det något idiotsäkert sätt att skydda sig mot sådana? T ex begränsa antalet tecken i inmatningsformuläret, göra om alla " till \", eller något annat? Tack! /Henke |
||
![]() |
![]() |
![]() |
#2 | ||
|
|||
Medlem
|
När det gäller Mysql ska du ha ' (apostrofer) runt alla värden du skickar till databasen. Vad det gäller data som kommer in utifrån (alla variabler som du inte definierar i ditt skript) så ska du byta ut alla ' mot \'
Det vanligaste man brukar kunna göra med SQL injection är att logga in som vem om helst utan lösenord och att hämta information på egen hand ur databasen. |
||
![]() |
![]() |
![]() |
#3 | ||
|
|||
Klarade millennium-buggen
|
Alla numeriska värden skall du låta gå igenom en intval() alt. floatval().
Alla strängar skall du låta gå igenom mysql_escape_string(). Numeriska värden behöver inte ' ' runt sig, utan bara strängar. |
||
![]() |
![]() |
![]() |
#4 | ||
|
|||
Medlem
|
Om du kör PHP kan du med fördel använda följande exempel (hämtad från http://se2.php.net/manual/en/functio...ape-string.php)
Kod:
<?php // Quote variable to make safe function quote_smart($value) { // Stripslashes if (get_magic_quotes_gpc()) { $value = stripslashes($value); } // Quote if not a number or a numeric string if (!is_numeric($value)) { $value = "'" . mysql_real_escape_string($value) . "'"; } return $value; } // Connect $link = mysql_connect('mysql_host', 'mysql_user', 'mysql_password') OR die(mysql_error()); // Make a safe query $query = sprintf("SELECT * FROM users WHERE user=%s AND password=%s", quote_smart($_POST['username']), quote_smart($_POST['password'])); mysql_query($query); ?> |
||
![]() |
![]() |
![]() |
#5 | |||
|
||||
Mycket flitig postare
|
Citat:
Ett bra sätt är ju att alltid tillåta endast maximalt nödvändiga rättigheter. Exempelvis om du har en applikation som består av en vanlig webbsida och ett CMS. Då är det bra ifall den db-användaren som används för att presentera webbsidan endast har läsrättigheter till databasen, medans db-användaren som används i CMS-et måste också ha skrivrättigheter. Generellt sett används SQL-injections för att ta reda på användarnamn och lösenord till olika delar av webbsiten eller ändra innehåll. |
|||
![]() |
![]() |
![]() |
#6 | |||
|
||||
Klarade millennium-buggen
|
...coh som en extra precaution så ska din första användare i din tabell ha 0 (noll/inga/zip/zilch/nada) rättigheter i ditt system då många injections helt enkelt plockar fram första bästa användare i ditt system (oftast den första raden i din tabell).
|
|||
![]() |
![]() |
![]() |
#7 | ||
|
|||
Flitig postare
|
ja.. otroligt många logins som man kan skriva följande som pass :
vadsomhelst' OR '1' = '1 |
||
![]() |
![]() |
![]() |
#8 | ||
|
|||
Supermoderator
|
Citat:
__________________
Full-stack developer, free for smaller assignments |
||
![]() |
![]() |
![]() |
#9 | ||
|
|||
Nykomling
|
PHP PDO extension med prepared statements är också ett alternativ för att minimera SQL-injektioner <http://www.php.net/manual/en/function.pdo-prepare.php>
|
||
![]() |
![]() |
![]() |
#10 | |||
|
||||
Klarade millennium-buggen
|
Citat:
![]() |
|||
![]() |
![]() |
Svara |
|
|