Autor | Zpráva | ||
---|---|---|---|
nethor Profil |
#1 · Zasláno: 21. 3. 2010, 10:28:12
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 |
#2 · Zasláno: 21. 3. 2010, 10:29:49
nethor:
je to prasárna :) zkus: if(is_numeric($_GET['id'])) if(preg_match("~\d+~", $_GET['id'])) |
||
fuckin Profil |
#3 · Zasláno: 21. 3. 2010, 10:58:33
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 |
#4 · Zasláno: 21. 3. 2010, 11:27:58
if(is_numeric($_GET['id']) ) {} Je určitě lepší. To jsem neznal, díky. |
||
AM_ Profil |
#5 · Zasláno: 21. 3. 2010, 11:37:10
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 |
#6 · Zasláno: 21. 3. 2010, 11:55:04 · Upravil/a: nethor
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 |
#7 · Zasláno: 21. 3. 2010, 11:57:10
nethor:
„To právě nejde, to by odpovídalo záznamu“ copak máš v DB ID=0? |
||
AM_ Profil |
#8 · Zasláno: 21. 3. 2010, 12:16:48
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 |
#9 · Zasláno: 21. 3. 2010, 12:36:27 · Upravil/a: nethor
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 |
#10 · Zasláno: 21. 3. 2010, 12:43:48
SwimX:
> nebo ještě lépe > if(preg_match("~\d+~", $_GET['id'])) tím by prošlo i abc34abc |
||
SwimX Profil |
#11 · Zasláno: 23. 3. 2010, 19:13:03 · Upravil/a: SwimX
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'])) |
||
Joker Profil |
#12 · Zasláno: 23. 3. 2010, 19:56:38
nethor:
Já tohle řeším obvykle zhruba: $id = intval($_GET["id"]); if($id == 0) // chyba (...) 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 htt>p://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. |
||
Časová prodleva: 3 dny
|
|||
shot Profil * |
#13 · Zasláno: 26. 3. 2010, 14:23:44
[#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 |
#14 · Zasláno: 26. 3. 2010, 14:48:45
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. |
||
Časová prodleva: 14 let
|
0