Kom ihåg mig?
Home Menu

Menu


[PHP] Bästa sätt att undvika SQL injections?

 
Ämnesverktyg Visningsalternativ
Oläst 2008-02-21, 17:51 #1
Jines avatar
Jine Jine är inte uppkopplad
Har WN som tidsfördriv
 
Reg.datum: Feb 2005
Inlägg: 1 032
Jine Jine är inte uppkopplad
Har WN som tidsfördriv
Jines avatar
 
Reg.datum: Feb 2005
Inlägg: 1 032
Hej!

Jag har en liten kort fråga.

Jag har läst rätt mycket om tekniker att STOPPA SQL injections, och har kommit på ett "bra" sätt att stoppa det, TROR jag?
Sättet är lätt att infoga i redan existerande kod och är rätt simpelt.
Frågan är nu bara om det fungerar i praktiken med?

Vanligaste sättet att stoppa sql injections (som jag sett) är genom att köra detta:
Kod:
$query = sprintf("SELECT * FROM users WHERE user='%s' AND password='%s'",
mysql_real_escape_string($user), mysql_real_escape_string($password));

mysql_query($query);
Den kommer dock ta massor av tid att ersätta denna med den ursprungliga koden.
Därför kom jag på ett annat alternativ, eftersom det är variablarna som kommer genom $_POST och $_GET som ska escapas, borde inte detta funka 100ggr bättre?

Kod:
// denna funktion placeras i en extern functions.php fil.
function e($str) {
   return mysql_real_escape_string($str)
}

$user = e($_POST['user']);
$pass = e($_POST['pass']);

$sql = "SELECT * FROM users WHERE user='$pass' AND password='$user';"
mysql_query($sql);
Kommer mitt sätt ens att fungera?
Kommer det fungera BRA? och är det tillräckligt säkert?
Varför använder alla den andra "tekniken" igentligen?

Hjälp mig!

mvh Jim
Jine är inte uppkopplad   Svara med citatSvara med citat
Oläst 2008-02-21, 18:59 #2
elofssons avatar
elofsson elofsson är inte uppkopplad
Mycket flitig postare
 
Reg.datum: Jul 2004
Inlägg: 881
elofsson elofsson är inte uppkopplad
Mycket flitig postare
elofssons avatar
 
Reg.datum: Jul 2004
Inlägg: 881
Dina varianter gör ju samma sak, bara två olika skrivsätt.
elofsson är inte uppkopplad   Svara med citatSvara med citat
Oläst 2008-02-21, 21:22 #3
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 elofsson@Feb 21 2008, 19:59
Dina varianter gör ju samma sak, bara två olika skrivsätt.
Mjo, enda skillnaden är att det blir mindre att skriva så på sätt och vis är det väl smidigare.
__________________
Full-stack developer, free for smaller assignments
tartareandesire är inte uppkopplad   Svara med citatSvara med citat
Oläst 2008-02-21, 21:28 #4
Jines avatar
Jine Jine är inte uppkopplad
Har WN som tidsfördriv
 
Reg.datum: Feb 2005
Inlägg: 1 032
Jine Jine är inte uppkopplad
Har WN som tidsfördriv
Jines avatar
 
Reg.datum: Feb 2005
Inlägg: 1 032
Tack för svaren!
Så båda borde alltså fungera lika bra? =)

mvh Jim
Jine är inte uppkopplad   Svara med citatSvara med citat
Oläst 2008-02-21, 21:36 #5
elofssons avatar
elofsson elofsson är inte uppkopplad
Mycket flitig postare
 
Reg.datum: Jul 2004
Inlägg: 881
elofsson elofsson är inte uppkopplad
Mycket flitig postare
elofssons avatar
 
Reg.datum: Jul 2004
Inlägg: 881
Citat:
Originally posted by Jine@Feb 21 2008, 22:28
Så båda borde alltså fungera lika bra? =)
mvh Jim
Svar ja, funktionsmässigt.
elofsson är inte uppkopplad   Svara med citatSvara med citat
Oläst 2008-02-22, 00:25 #6
Jines avatar
Jine Jine är inte uppkopplad
Har WN som tidsfördriv
 
Reg.datum: Feb 2005
Inlägg: 1 032
Jine Jine är inte uppkopplad
Har WN som tidsfördriv
Jines avatar
 
Reg.datum: Feb 2005
Inlägg: 1 032
I form av prestanda och belastning då?

mvh Jim
Jine är inte uppkopplad   Svara med citatSvara med citat
Oläst 2008-02-22, 01:50 #7
JonathanJames JonathanJames är inte uppkopplad
Nykomling
 
Reg.datum: Jul 2007
Inlägg: 37
JonathanJames JonathanJames är inte uppkopplad
Nykomling
 
Reg.datum: Jul 2007
Inlägg: 37
Ingen skillnad, PHP-interpretern kommer tolka din kod och därmed också praktiskt ersätta (blir ju pekare till slut)varenda e($_POST['variabel']); med mysql_real_escape_string($_POST['variabel']);

Interpretern kommer inte att snurra några extravarv funktionsmässigt, funktionen är mer en estetisk grej för dig som programmerare.
JonathanJames är inte uppkopplad   Svara med citatSvara med citat
Oläst 2008-02-22, 07:33 #8
Adam N Adam N är inte uppkopplad
Medlem
 
Reg.datum: Feb 2008
Inlägg: 205
Adam N Adam N är inte uppkopplad
Medlem
 
Reg.datum: Feb 2008
Inlägg: 205
Båda varianterna blir ju lite jobbiga om det är mer än bara user och password. Går det i PHP att
skriva någon generell funktion som loopar igenom alla POST-variabler och gör om dem? Jag kan
inte PHP, men tänkte mig alltså något i stil med...

Kod:
function mysql_real_escape_POST() {
  for_each variable in $_POST {
    variable = mysql_real_escape_string(variable)
   return mysql_real_escape_string($str)
}
...i en extern php-fil och sen är det bara att anropa denna funktion en gång i början av varje sida
där det behövs. Kanske går att konfigurera så att den anropas automatiskt till och med.

Någon som kan PHP får gärna rätta till detta exempel.

Sen vill man väl i vissa fall ge ett tydligt felmeddelande istället för att exekvera SQL-satsen om
någon skickar otillåtna tecken. Detta bör i så fall göras på både serversidan och klientsidan.
Adam N är inte uppkopplad   Svara med citatSvara med citat
Oläst 2008-02-22, 07:39 #9
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
Ta en titt på MySQLi och Prepared Statements, mycket säkrare.
Jonas är inte uppkopplad   Svara med citatSvara med citat
Oläst 2008-02-22, 08:34 #10
Lumax Lumax är inte uppkopplad
Mycket flitig postare
 
Reg.datum: Jun 2004
Inlägg: 610
Lumax Lumax är inte uppkopplad
Mycket flitig postare
 
Reg.datum: Jun 2004
Inlägg: 610
Citat:
Originally posted by Adam N@Feb 22 2008, 08:33
Båda varianterna blir ju lite jobbiga om det är mer än bara user och password. Går det i PHP att
skriva någon generell funktion som loopar igenom alla POST-variabler och gör om dem? Jag kan
inte PHP, men tänkte mig alltså något i stil med...

Kod:
function mysql_real_escape_POST() {
  for_each variable in $_POST {
    variable = mysql_real_escape_string(variable)
   return mysql_real_escape_string($str)
}
...i en extern php-fil och sen är det bara att anropa denna funktion en gång i början av varje sida
där det behövs. Kanske går att konfigurera så att den anropas automatiskt till och med.

Någon som kan PHP får gärna rätta till detta exempel.

Sen vill man väl i vissa fall ge ett tydligt felmeddelande istället för att exekvera SQL-satsen om
någon skickar otillåtna tecken. Detta bör i så fall göras på både serversidan och klientsidan.
Du kan lägga in följande kod i "header.php" eller motsvarande.
Kod:
if (get_magic_quotes_gpc()) {
  $_GET = array_map("stripslashes", $_GET);
  $_POST = array_map("stripslashes", $_POST);
}

$_GET = array_map("mysql_real_escape_string", $_GET);
$_POST = array_map("mysql_real_escape_string", $_POST);
Lumax ä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 04:53.

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