Autor Zpráva
nethor
Profil
Předávám parametr metodou get např. ?id=5
Řeším ošetření id - v databázi je to integer.
Takže potřebuji podmínku, " když je $_GET['id'] něco, co může být integer"
tedy např:
?id=5	ano
?id=0	ano
?id=	ne
?id=x 	ne


Nejelegantnější zápis na který jsem přišel je :
if ((string)$_GET['id'] == (string)(int)$_GET['id'] ) {}

Jen si nejsem jistý, jestli to dvojí přetypování není prasárna, která mě může časem vypéct.
Co myslíte?
SwimX
Profil
nethor:
je to prasárna :)
zkus:
if(is_numeric($_GET['id']))
nebo ještě lépe
if(preg_match("~\d+~", $_GET['id']))
fuckin
Profil
Prasárna to určitě není, nicméně to snižuje čitelnost. Může se v tom objevit i několik chyb na které třeba přijdeš časem.

Např moje řešení dané situace
$id = is_numeric($_GET['id']) ? (int)$_GET['id'] : false; 
nethor
Profil
if(is_numeric($_GET['id']) ) {}

Je určitě lepší. To jsem neznal, díky.
AM_
Profil
Nebo se s tím nebabrat a napsat prostě
$id = intval($_GET['id'])

intval je funkce, která se chová podobně, jako přetypování na INT, jen si poradí s různými dalšími odchylkami (myslím že třeba s mezerami mezi číslicemi).
Na ověřování bych se vykašlal, když někdo zadá něco jiného, než integer, prostě se z toho tímhle stane 0 a útočník má smůlu.
nethor
Profil
AM:
Na ověřování bych se vykašlal, když někdo zadá něco jiného, než integer, prostě se z toho tímhle stane 0 a útočník má smůlu.
To právě nejde, to by odpovídalo záznamu '... where id = 0 ...' stejně jako ?id=0 , což integer JE.
Na ověřování bych se nevykašlal, to by byla teprve prasárna! ;-)
panther
Profil
nethor:
To právě nejde, to by odpovídalo záznamu
copak máš v DB ID=0?
AM_
Profil
nethor:
No a ono něčemu vadí, kdyby útočník napsal http://example.com/?id=';DROP TABLE products;, a zobrazil by se mu nultý záznam?
Navíc, jak praví panther, AUTO_INCREMENT běží od 1, takže bych se taky divil, kdybys měl záznam s číslem 0.
nethor
Profil
Auto_increment není 0 , ale u dalších propojených tabulek to 0 být může.
Chtěl jsem to ošetřit a zajímalo mě, jak to udělat správně.
is_numeric($_GET['id']) je přesně řešení které jsem hledal.
nightfish
Profil
SwimX:
nebo ještě lépe
if(preg_match("~\d+~", $_GET['id']))

tím by prošlo i abc34abc
SwimX
Profil
nightfish:
nj, zapomněl jsem na ^ $ :)
if(preg_match("~^\d+$~", $_GET['id']))

edit: nethor

Auto_increment není 0 , ale u dalších propojených tabulek to 0 být může.
is_numeric($_GET['id']) je přesně řešení které jsem hledal.
tím ale nula projde také. Navíc projde i 4e3 což je 4 * 10^3 tedy 4000
upřímě teď nevím, co na to databáze:
SELECT * FROM table WHERE id = 4e3

osobně bych stejně volil regulár
if(preg_match("~^[1-9]\d+$~", $_GET['id']))
(tím sice neprojde "01", ale to snad nevadí)
Joker
Profil
nethor:
Já tohle řeším obvykle zhruba:
$id = intval($_GET["id"]);
if($id == 0) // chyba
(...)
Samozřejmě to vyžaduje, aby 0 nebyla platná hodnota ID, nicméně obecně nepovažuji za dobrý nápad nastavovat nějakému záznamu ID=0.

Ovšem i pokud 0 bude platná hodnota, nepřipadá mi použití intval() rizikové.
Jak píše AM: No a ono něčemu vadí, kdyby útočník napsal http://example.com/?id=';DROP TABLE products;, a zobrazil by se mu nultý záznam?

Místo neplatného ID totiž můžu sestavovat dotazy s platným ID (takové to, že zvídavý uživatel si všimne, že v adrese je ?id=124 a zkusí 125, 126, ...)
Tohle se pouhou validací vstupu neodchytí a zároveň by takový skript byl zranitelný na CSRF, takže stejně nemůže dělat nějaké kritické operace.
Pokud tuhle zranitelnost vyřeší, nebude zároveň fungovat ani podsouvání nějakého nesmyslného ID.
shot
Profil *
[#12] Joker
Místo neplatného ID totiž můžu sestavovat dotazy s platným ID (takové to, že zvídavý uživatel si všimne, že v adrese je ?id=124 a zkusí 125, 126, ...)

Jenže to už je věc druhá... Pokud bude e-shop s produktama tak to nikomu nevadí. A když bude edit_profil?id=1 tak tam se to musí zabezpečit úplně jinak.
Joker
Profil
shot:
Jenže to už je věc druhá... Pokud bude e-shop s produktama tak to nikomu nevadí.
Přesně o tom jsem psal.
Místo ?id=1 můžu do adresy napsat ?id=2 a dostal bych jiný záznam.
-> Jestliže tohle nevadí, nejspíš nebude ani vadit, že ?id=nesmysl zobrazí to samé jako ?id=0
-> Jestliže tohle vadí, pouhá validace vstupu to stejně nevyřeší a bude potřeba aplikovat jiné řešení, které rovnou bude řešit i ten problém s nesmyslným ID.

Vaše odpověď

Mohlo by se hodit


Prosím používejte diakritiku a interpunkci.

Ochrana proti spamu. Napište prosím číslo dvě-sta čtyřicet-sedm:

0