Apache (DELSI)
oldfrog.linux na volny.cz
oldfrog.linux na volny.cz
Středa Říjen 27 10:54:01 CEST 2004
Max Černý wrote:
>> Kdepak jste to hledal, kdyz ne na webu php.net?
>> http://cz.php.net/register_globals
>
> Tento clanek jsem cetl... Ale neni v nem odpoved na moji otazku. Tyto
> dva popsane zpusoby jsou prece stejne zabezpecene. Zadny rozdil tu
> nevidim... Nebo snad ano?
Protoze nelze zjistit, zda hodnoty POST a GET nastavil skript nebo rucne
uzivatel, je vhodne zarucit, aby metody POST a GET nemohly primo menit interni
promene skriptu. To zajisti volba register_globals=off. Veskere nacitani dat
pak probiha vedome ctenim z poli POST a GET. Tim lze zajistit, ze vykonavani
programu nebude primo rizeno hodnotami, ktere do skriptu v neocekavanem miste
cilene zanesl utocnik.
Nebezpeci ovsem pochazi take jiz ze samotnych hodnot nactenych od uzivatele.
Neni trivialni zarucit, ze nactena hodnota je duveryhodna a ze napriklad neobsahuje
kod, ktery bude nejakou fintou nechtene vykonan. V tomto pripade je skoro jedno,
zda mam nactenou hodnotu pristupnou v aktualnim jmennem prostoru nebo uvnitr
nejakeho pole. V obou pripadech ji budu chtit nejak pouzit a toto pouziti muze
probehnout jinak nez jsem zamyslel (vykonanim zavleceneho kodu).
Jsou tu tedy nebezpeci dve - neduveryhodna hodnota promenne a zmena promenne
v miste, kde nemela byt menena. Nastaveni volby register_globals na off pomuze
toliko v druhem pripade a navic pouze tehdy, je-li skript dobre napsan. Samotne
pouziti $_GET a $_POST neprinasi zadnou zmenu bezpecnosti.
Toto je malokde jasne vysvetleno a i priklady uvedene na
http://www.php.net/manual/en/security.globals.php podle me situaci spise
zamlzuji.
Uvedu podobne tri priklady. Nasledujici kod
if ($authorized) {
include "/highly/sensitive/data.php";
}
obsahuje stejnou chybu jako kod
if ($_GET['authorized']) {
include "/highly/sensitive/data.php";
}
Chyba spociva v tom, ze se program rozhoduje na zaklade hodnoty, kterou muze
pripadne rucne zadat utocnik. V druhem prikladu muze hodnotu zadat utocnik vzdy
- nezavisle na nastaveni register_globals, protoze zde jaksi vedome program cte
uzivatelska data. V prvnim priklade lze podvrhnout hodnotu authorized jen pri
zapnutych register globals.
Univerzalnejsi reseni je treba
if (user_authorized()) {
include "/highly/sensitive/data.php";
}
kdy fce user_authorized() vrati TRUE nebo FALSE. Nyni je pripadne
kompromitovatelny kod soustreden ve fci user_authorized() a lze jej navic
kompromitovat jen nebezpecnou hodnotou (fce ma vlastni jmenny prostor,
ktery importuje jen globalni promenne a deklarovane parametry fce)
prihlasovacich udaju (nactenych treba z $_POST). Samotne rozhodovani
ve vyse uvedenem kodu se deje na zaklade hotnoty, kterou mam plne
pod kontrolou a nezalezi pritom na nastaveni register_globals.
Je to mozna trochu OT tema, ale ne zase tolik, protoze adminovi by melo byt
jasne proc ma v php nastavene register_globals=off.
Zdravi
OldFrog.
--
------------------------------
Ondrej Nemecek alias 'OldFrog'
tel (domu): 241766035
tel (prace): 222090711
tel (mobil): 775046246
icq: 250163477
------------------------------
Další informace o konferenci Linux