Kom ihåg mig?
Home Menu

Menu


SQL-injektioner

 
Ämnesverktyg Visningsalternativ
Oläst 2006-06-04, 22:32 #1
henkealf henkealf är inte uppkopplad
Medlem
 
Reg.datum: Jan 2004
Inlägg: 163
henkealf henkealf är inte uppkopplad
Medlem
 
Reg.datum: Jan 2004
Inlägg: 163
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
henkealf är inte uppkopplad   Svara med citatSvara med citat
Oläst 2006-06-04, 22:35 #2
tydal tydal är inte uppkopplad
Medlem
 
Reg.datum: May 2005
Inlägg: 130
tydal tydal är inte uppkopplad
Medlem
 
Reg.datum: May 2005
Inlägg: 130
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.
tydal är inte uppkopplad   Svara med citatSvara med citat
Oläst 2006-06-04, 23:22 #3
Jonas Jonas är inte uppkopplad
Klarade millennium-buggen
 
Reg.datum: Feb 2004
Inlägg: 3 364
Jonas Jonas är inte uppkopplad
Klarade millennium-buggen
 
Reg.datum: Feb 2004
Inlägg: 3 364
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.
Jonas är inte uppkopplad   Svara med citatSvara med citat
Oläst 2006-06-04, 23:28 #4
bivald bivald är inte uppkopplad
Medlem
 
Reg.datum: Feb 2006
Inlägg: 207
bivald bivald är inte uppkopplad
Medlem
 
Reg.datum: Feb 2006
Inlägg: 207
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);
?>
Mer teori om SQL injections hittar du på google..
bivald är inte uppkopplad   Svara med citatSvara med citat
Oläst 2006-06-05, 01:02 #5
zorans avatar
zoran zoran är inte uppkopplad
Mycket flitig postare
 
Reg.datum: Jun 2004
Inlägg: 598
zoran zoran är inte uppkopplad
Mycket flitig postare
zorans avatar
 
Reg.datum: Jun 2004
Inlägg: 598
Citat:
Originally posted by henkealf@Jun 4 2006, 22:32
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
SQL-injections kan ställa till med olika saker beroende på vad den konfigurerade databasanvändaren i applikationen kan göra. Låt oss säga att du har en applikation som använder "root"-användaren. Då kan en SQL-injection visa ditt data, radera ditt data, skriva fil till filsystemet som samma användare som mysql körs, och sist men inte minst göra din mysql-server totalt obrukbar.

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.
zoran är inte uppkopplad   Svara med citatSvara med citat
Oläst 2006-06-05, 13:10 #6
Roberts avatar
Robert Robert är inte uppkopplad
Klarade millennium-buggen
 
Reg.datum: Jan 2004
Inlägg: 2 103
Robert Robert är inte uppkopplad
Klarade millennium-buggen
Roberts avatar
 
Reg.datum: Jan 2004
Inlägg: 2 103
...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).
Robert är inte uppkopplad   Svara med citatSvara med citat
Oläst 2006-06-05, 14:40 #7
Staffconsulting Staffconsulting är inte uppkopplad
Flitig postare
 
Reg.datum: May 2004
Inlägg: 358
Staffconsulting Staffconsulting är inte uppkopplad
Flitig postare
 
Reg.datum: May 2004
Inlägg: 358
ja.. otroligt många logins som man kan skriva följande som pass :

vadsomhelst' OR '1' = '1
Staffconsulting är inte uppkopplad   Svara med citatSvara med citat
Oläst 2006-06-05, 14:47 #8
tartareandesire tartareandesire är inte uppkopplad
Supermoderator
 
Reg.datum: Jan 2004
Inlägg: 11 585
tartareandesire tartareandesire är inte uppkopplad
Supermoderator
 
Reg.datum: Jan 2004
Inlägg: 11 585
Citat:
Originally posted by Jonas@Jun 4 2006, 23:22
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.
Använd mysql_real_escape_string(sträng) istället. Har du inloggning av något slag (antingen för användare eller dig själv i något admin-gränssnitt) så bör du även envägskryptera lösenorden.
__________________
Full-stack developer, free for smaller assignments
tartareandesire är inte uppkopplad   Svara med citatSvara med citat
Oläst 2006-06-05, 15:34 #9
Simon_Jansson Simon_Jansson är inte uppkopplad
Nykomling
 
Reg.datum: May 2004
Inlägg: 2
Simon_Jansson Simon_Jansson är inte uppkopplad
Nykomling
 
Reg.datum: May 2004
Inlägg: 2
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>
Simon_Jansson är inte uppkopplad   Svara med citatSvara med citat
Oläst 2006-06-05, 16:05 #10
Roberts avatar
Robert Robert är inte uppkopplad
Klarade millennium-buggen
 
Reg.datum: Jan 2004
Inlägg: 2 103
Robert Robert är inte uppkopplad
Klarade millennium-buggen
Roberts avatar
 
Reg.datum: Jan 2004
Inlägg: 2 103
Citat:
Originally posted by Staffconsulting@Jun 5 2006, 14:40
ja.. otroligt många logins som man kan skriva följande som pass :

vadsomhelst' OR '1' = '1
Du glömde -- efter din injection
Robert är inte uppkopplad   Svara med citatSvara med citat
Svara


Aktiva användare som för närvarande tittar på det här ämnet: 1 (0 medlemmar och 1 gäster)
 

Regler för att posta
Du får inte posta nya ämnen
Du får inte posta svar
Du får inte posta bifogade filer
Du får inte redigera dina inlägg

BB-kod är
Smilies är
[IMG]-kod är
HTML-kod är av

Forumhopp


Alla tider är GMT +2. Klockan är nu 18:57.

Programvara från: vBulletin® Version 3.8.2
Copyright ©2000 - 2025, Jelsoft Enterprises Ltd.
Svensk översättning av: Anders Pettersson
 
Copyright © 2017