WN

WN (https://www.wn.se/forum/index.php)
-   Serversidans teknologier (https://www.wn.se/forum/forumdisplay.php?f=4)
-   -   Skottsäkert skydd mot SQL-injection? (https://www.wn.se/forum/showthread.php?t=1041230)

Lando 2010-03-31 03:23

Skottsäkert skydd mot SQL-injection?
 
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!

najk 2010-03-31 06:56

Kika på http://php.net/manual/en/function.my...ape-string.php

youheardit 2010-03-31 07:42

jag brukar använda:
PHP-kod:

$var mysql_real_escape_string(stripslashes(strip_tags($_GET['var']))); 

Fast jag använder bara strip_tags() om informationen ska skrivas ut utan html kodning osv.
Annars kan du ignorera den!

BjörnJ 2010-03-31 08:09

Om det är heltal kan man köra:
PHP-kod:

$var intval($_GET[var]); 

Om det är flyttal kan man köra floatval(). Annars alltid mysql_real_escape_string() som najk länkade till. Den senare kan användas även till numeriska värden.

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.

martine 2010-03-31 09:31

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...

eliasson 2010-03-31 09:46

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.

emilv 2010-03-31 09:52

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.

forngren 2010-03-31 11:33

Prepared statements eller PDO som emil redan tipsat om är the shit.

tartareandesire 2010-03-31 12:18

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.

Ara 2010-03-31 16:03

SQL-injection, det va vär typ 7-8 år sedan det funkade? Eller är folk/siter fortfarande kassa på att skydda sig?


Alla tider är GMT +2. Klockan är nu 16:50.

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