FAQ |
Kalender |
|
![]() |
#1 | |||
|
||||
Medlem
|
Hej alla!
Jag har kollat runt lite och hittar inget bra om SQL-injections. Finns det något Skottsäkert skydd emot detta? Tex: Bra: $var = $_GET[var]; //1 $sql = "SELECT * FROM ex WHERE var='$var'"; //SELECT * FROM ex WHERE var='1' Problem: $var = $_GET[var]; //' OR 1=1 $sql = "SELECT * FROM ex WHERE var='$var'"; //SELECT * FROM ex WHERE var='1' OR 1=1 Tack för svar! |
|||
![]() |
![]() |
![]() |
#2 | |||
|
||||
Har WN som tidsfördriv
|
||||
![]() |
![]() |
![]() |
#3 | ||
|
|||
Har WN som tidsfördriv
|
jag brukar använda:
PHP-kod:
Annars kan du ignorera den! |
||
![]() |
![]() |
![]() |
#4 | ||
|
|||
Mycket flitig postare
|
Om det är heltal kan man köra:
PHP-kod:
En fördel med intval och floatval är om man ska använda datan på andra ställen också, och inte bara i databasanrop. Man behöver t.ex. inte använda htmlspecialchars() vid utskrift av data från intval() eller floatval(). Om man verifierar datan på något sätt (t.ex. för att se att ett formulär är rätt ifyllt) kan man i vissa fall skippa mysql_real_escape_string(), men då gäller det att man verkligen har ordentlig koll på vad man gör, och vara säker på att det inte kan leda till problem om man gör någon uppdatering av koden i framtiden. Tänk på att all data som kommer från användaren kan vara försök till SQL-injection, inklusive bl.a. cookies och information om vilken webbläsare som används. Senast redigerad av BjörnJ den 2010-03-31 klockan 08:12 |
||
![]() |
![]() |
![]() |
#5 | |||
|
||||
Mycket flitig postare
|
Jag för min del använder $var = (int)$_GET['var']; vilket gör samma sak som BjörnJ:s kod.
Det finns även andra fördelar med att betrakta siffervärden som just siffror och att genomföra en injektion med enbart siffror lär nog vara helt omöjligt. Dessutom Lando, så finns det ingen anledning att använda ' med nummer i din query eftersom det inte handlar om strängar... |
|||
![]() |
![]() |
![]() |
#6 | ||
|
|||
Bara ett inlägg till!
|
Min rekommendation är att endast använda mysql_real_escape_string() vid in-data, och sedan använder du nödvändiga funktioner (t ex stripslashes() osv) när du skriver ut informationen.
|
||
![]() |
![]() |
![]() |
#7 | |||
|
||||
Bara ett inlägg till!
|
Min rekommendation är att köra PDO så slipper du tänka på SQL-injektioner. Då får du även fördelen att det blir lättare vid ett eventuellt byte av databasmotor.
|
|||
![]() |
![]() |
![]() |
#8 | |||
|
||||
Flitig postare
|
Prepared statements eller PDO som emil redan tipsat om är the shit.
|
|||
![]() |
![]() |
![]() |
#9 | ||
|
|||
Supermoderator
|
Just $_GET-variablerna är många som glömmer bort att skydda av någon anledning. mysql_real_escape_string är det som gäller "som vanligt".
Därutöver kan du alltid köra t.ex. intval när du ska ha ett heltal. Som martine påpekade är det onödigt att använda citattecken när det handlar om heltalsfält. Se istället till att du alltid skickar in ett heltal (den valideringen måste du ändå göra om sidan ska fungera som det är tänkt) så går sql-satsen något snabbare att exekvera. Det är bra att rutinoptimera kod så slipper man tänka på det när man väl arbetar med tyngre trafik.
__________________
Full-stack developer, free for smaller assignments |
||
![]() |
![]() |
![]() |
#10 | ||
|
|||
Bara ett inlägg till!
|
SQL-injection, det va vär typ 7-8 år sedan det funkade? Eller är folk/siter fortfarande kassa på att skydda sig?
|
||
![]() |
![]() |
Svara |
|
|