webForumDet fria alternativet

Säkerhet? Delar av SQL-sats i Query

PHP

6 svar · 394 visningar · startad av axl

Medlem sedan sep. 200316 inlägg
Frågan#1

Hej!
Håller på att bygga en webshop. Har lite frågor om detta. Har en php-fil som heter listaprod.php som lista alla produkter.

1. Den får delar av SQL-satsen i en querystring hur osäkert/säkert är det igentligen?

2. Jag använder funktionen QueryCode och QueryDecode, ngn som har ngt tips om ett bättre sätt att lösa problemet med = och '?

utdrag ur koden:

Function QueryDecode($str)
{
$str = str_replace("xlikax", "=", $str);
$str = str_replace("xsnuffx", "'", $str);
return($str);
}

Function QueryCode($str)
{
$str = str_replace("=", "xlikax",  $str);
$str = str_replace("'", "xsnuffx", $str);
return($str);
}

// $urval kan till exempel vara "kategorixlikax10" el
// "namn like xsnuffx%apa%xsnuffx" 
// $sort kan vara tex "namn" el "namn DESC"
$SQL =  "SELECT artnr,namn,webbpris FROM produkt WHERE " . QueryDecode($urval) . " ORDER BY " . $sort . ";";

Tacksam för svar!

Medlem sedan mars 20032 667 inlägg
#2

* Se till så att PHP kör addslashes() automatiskt på dina variabler, vilket är default.
* Validera dina (numeriska) värden innan de skickas till sql-frågan.

Medlem sedan sep. 200316 inlägg
#3

Hej igen!
Jag kanske är lite trög ;) men fattar inte riktigt det där med add_slashes, ngn som kan förklara närmare.

Skickar inga querystring som innehåller bara tal så Isnumric() går ju inte och använda

BTW, jag har "register_globals = On" i php.ini, hur osäkert/säkert är detta?

Medlem sedan mars 20032 667 inlägg
#4

register_globals ska vara avstängd och du ska/bör använda:

$_GET['var']
$_POST['var']
$_SESSION['var']
osv

istället för bara $var

Men det har mer med funktionalitet att göra.

Angående addslashes() så handlar det om att köra escapesekvenser automatiskt när så behövs. Detta ställs in i php.ini enligt följade (men kan även ställas in med ini_set()):

php.ini skrev:

Magic quotes for incoming GET/POST/Cookie data.
magic_quotes_gpc = On

Magic quotes for runtime-generated data, e.g. data from SQL, from exec(), etc.
magic_quotes_runtime = Off

Use Sybase-style magic quotes (escape ' with '' instead of ').
magic_quotes_sybase = Off

Medlem sedan mars 20032 667 inlägg
#5

Missade en sak, isnumeric() validerar inte numeriska värden helt och hållet. Den godkänner lite avvikelser. Istället bör du använda exempelvis följande pattern:

!preg_match( "/^([0-9]+)$/", $_GET['numericVar'] )

RED:
Missade en parantes.

Medlem sedan sep. 200316 inlägg
#6

Jag tror det har klarnat för mig lite! Tack för hjälpen!

Medlem sedan juni 200443 inlägg
#7

Jaha första posten. :)

Jag brukar använda denna funktion,så slipper man problem med att maqic quotes kan vara av- respektive påslaget.

function db_in( $indata ){
if(get_magic_quotes_gpc()){
return trim($indata);
}else{
return addslashes(trim($indata));
}
}

$var = db_in($_GET['something'])

"SELECT * FROM x WHERE y = '$var' ";

..och om det inte är en sträng utan bara ett id :

$id = (int) $_GET['id']

Då kan man inte manipulera strängen. Bokstäver tex blir till en nolla bara..

261 ms totalt · 4 externa anrop · v20260731065814-full.1dc6f849
122 ms — deklarationer (db)
0 ms — hämta statistik (cache)
136 ms — hämta tråd, inlägg och bilagor (db)
121 ms — ändringar (db)