Autor Zpráva
manulka.cz
Profil *
Ahoj! mám takový dotaz. Ošetření pro SQL injection se používá jen tehdy když mám v mysql_query GET, POST či SESSION?? když mám např. že id = 1 tak se to neošetřuje nijak?? a ještě v odkazu typu todle:
<form action="<?=$sekce?>.php?clanek=cl_cely&amp;id_clanku=<?=$zaznam["id_clanku"]?>&amp;id_sekce=<?=$_REQUEST["id_sekce"]?>" method="post">

se REQUEST taky ošetřuje nebo zas jenom v SQL příkazech?? děkuji moc, moc té ochraně nerozumím a to už hledám na webu fakt dlouho :-( takže pomohla by jakákoli pomoc či vysvětlení :-)
Chamurappi
Profil
Reaguji na manulku.cz:
Je fascinující, jak se lidé učí názvy bezpečnostních děr, ale nezkoumají při tom jejich podstatu.

když mám např. že id = 1 tak se to neošetřuje nijak??
Hrozí tam, že návštěvník vloží do SQL dotazu nebezpečný kód?

a ještě v odkazu typu todle […] se REQUEST taky ošetřuje nebo zas jenom v SQL příkazech??
Hrozí tam nějaký útok? Když ti do parametru id_sekce vložím uvozovky a menšítko, jak bude vypadat výsledný kód?
manulka.cz
Profil *
já se omlouvám za své nedostatečné info, ale tak chybami se člověk učí.
takže když přepíšu např. ten odkkaz na toto:
echo "<a href=\"".$_SERVER["PHP_SELF"]."?clanek=info&amp;id_sekce=".intval($_REQUEST["id_sekce"])."&amp;celkem=".intval($celkem)."&amp;od=".intval(1)."\">Začátek</a>&nbsp;|&nbsp;";

Mohlo by to tak být??
Chamurappi
Profil
Reaguji na manulku.cz:
já se omlouvám za své nedostatečné info, ale tak chybami se člověk učí
Bezpečnostními chybami se spíš mučí. Stačí přemýšlet — vžij se do role imaginární zlé manulky.cz a přemýšlej, jak se hacknout skrze uživatelské vstupy.

intval(1)
Nemá smysl ošetřovat hodnoty, které nemůžou být podvrhnuté.
manulka.cz
Profil *
když on je právě ten problém, že si to moc představit neumím :-( právě proto stále moc nechápu co ošetřovat a co ne. Vím, že se všude píše že má smysl ošetřovat sql příkazy, ale když mám odkaz, tak v něm se ty hodnoty taky musí ošetřit nebo tedy ne, když to nemá zde smysl, jak píšeš...
unlucky
Profil
mysql_real_escape_string

jinak hrozi, ze vam v url nekdo zada
clanek.php?id=1; drop table neco; atdd
Step
Profil
myslim, že je nejlepší ošetřovat tyhle věci přímo v dotazu, takhle například hrozí, že si někdo přepíše zdrojový kód (třeba v opeře to de) a změní si tam např
id_sekce='... (nevim přesně jak se dělá mysql_injection:-)) , uloží změny a data se nebudou dále ošetřovat tak si útočník může dělat co chce...

já např ošetřuji i data ze <select> i když by se zdálo, že data posílaná selectem jsou bezpečná
panther
Profil
Step:
že si někdo přepíše zdrojový kód (třeba v opeře to de)
ano, jde, ale upravený kód se neodešle na server. Tudíž je to jedno.
Chamurappi
Profil
Reaguji na panthera:
Step chtěl asi říct, že všechny vstupy z formuláře jde podvrhnout a člověk programující serverovou část by jim tedy neměl důvěřovat.
Step
Profil
Chamurappi:
Step chtěl asi říct, že všechny vstupy z formuláře jde podvrhnout a člověk programující serverovou část by jim tedy neměl důvěřovat.

Přesně tak, všechny data od uživatele jsou potenciálně nebezpečná.

panther:
ano, jde, ale upravený kód se neodešle na server. Tudíž je to jedno.

tak to už jsem nikdy nezkoumal:-)
manulka.cz
Profil *
takže jestli jsem dobře pochopila. i když je REQUEST["id"] např. číslo nebo má být číslo, tak i tak se tam píše mysql_real_escape_string??
Joker
Profil
manulka.cz:
Kdybych shrnul pár obecných pravidel:
- Vstupy se dělí na důvěryhodné a nedůvěryhodné
- Důvěryhodné jsou hlavně ty, které si aplikace vytvoří sama (například když dám $a = 1, tak dál ve skriptu budu věřit, že tam ta jednička opravdu je)
- Nedůvěryhodné je hlavně cokoliv, co přijde od uživatele, včetně skrytých políček ve formuláři a políček kontrolovaných Javascriptem (protože to všechno se dá obejít)

i když je REQUEST["id"] např. číslo nebo má být číslo, tak i tak se tam píše mysql_real_escape_string?
Ne. "Zdůvěryhodnění" základních datových typů se dá udělat takhle:
- boolean -> isset() nebo empty() (když mám $vyplneno = !empty($_GET["policko"]); tak v políčku může přijít cokoliv a $vyplneno bude jen true nebo false)
- číslo -> více možností, například intval() (výsledkem jakéhokoliv nečíselného vstupu bude 0)
- řetězec -> před uložením do databáze se projede mysql_real_escape_string.

Samozřejmě tohle jsou jen ty nejobecnější kontroly, na konkrétní vstupy se dá aplikovat ještě spousta dalších (například můžu navíc chtít, aby řetězec neobsahoval nějaké znaky, nebo vím, že číslo musí být od 1 do 10 a podobně. To už záleží na konkrétním vstupu).
manulka.cz
Profil *
diky moc za vysvetleni, tohle mi urcite moc pomohlo!! :-) takze kdyz jsem mela v tom svym kodu id_sekce=".intval($_REQUEST["id_sekce"]), tak to bylo spravne osetreni??
Spacebar
Profil
Hmm.. Když generuješ odkaz a dáváš tam data z databáze, není tam co ošetřovat (pokud už není pozdě).
Jde o to ošetřit vstup, takže třeba místo
$id_clanku = $_GET["id"];

dát
$id_clanku = intval($_GET["id"];

Takto to aspoň dělám já. Pokud se nejedná o číselný uživatelský vstup, použij místo intvalu funkce, jež ti zaslal Joker.
manulka.cz
Profil *
oki. to me taky mohlo dojit, coz je pravda :-) a jeste posledni dotazek, kdyz budu mit kod
$vysledek = mysql_query ("select * from clanky where id_clanku = " .intval($_REQUEST["id_clanku"]). ";", $GLOBALS["link"]);

tak intval je zde zbytecne nebo ho sem prave musim dat. zrejme ano ze??
Spacebar
Profil
Ano. $_REQUEST["id_clanku"] totiž obsahuje vstup od uživatele, který může potencionální hacker změnit.

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: