Autor Zpráva
Duchaplny
Profil
Zdravím,

chcel by som tu predviesť 2 príklady a zaujíma ma ich bezpečnosť, keď využívam formu $_GET, aj ako podmienku na zapisovanie do db.

Príklad 1:
v pošte si užívateľ vyberie poštu, ktorú chce čítať. V url to hodí niečo ako ?page=mail&status=receive&postID=1.
Keď užívateľ prepíše postID na 2 a pošta patrí jemu (o to sa stará mysql_query, musí sa zhodovať príjemca so $_SESSION), tak sa zobrazí text správy, ktorá je v db uložená pod id 2. Ak mu nepatrí, tak sa nezobrazí nič, pretože nesplní podmienky zobrazenia.

Príklad 2:
tutorial, ktorý ide postupne strana po strane a je ochránený tak, že pokiaľ by sa chcel niekto dostať z prvej strany na poslednú, tak by sa
mu to nemalo podariť ani keby vedel URL poslednej strany, pretože záznam o aktuálnej strane, na ktorej užívateľ je, sa ukľadá do db a ten človek musí ísť postupne stranu po strane.. scriptové podmienky nedovolia načítať/uložiť stranu 3, pokiaľ užívateľ nedosiahol stranu 2.. čiže je tam postupnosť, ktorá musí byť dodržaná.. kontroluje to podmienka a až potom to ukladá do MySQL.

Každý musí byť zaregistrovaný, inak nemá prístup k ničomu.. v podstate tam mám všetko nastavené tak, aby číslo, ktoré chce užívateľ zmeniť, nijak neuškodilo inému užívateľovi alebo aby nenarušilo chod/pripravenú postupnosť stránky.

Stačí takáto ochrana alebo sa to dá ľahko obísť/zneužiť ?
ShiraNai7
Profil
Pokud validuješ všechna vstupní data a jen je slepě nepoužíváš (což asi neděláš podle toho, co píšeš), tak by to mělo být ok.
Duchaplny
Profil
Snažím sa všetko ochrániť podmienkami, aby tam neboli bezpečnostné diery, potom to následne rôznymi spôsobmi/užívateľmi testujem a opravujem prípadné chyby.

Akurát nepoznám všetky spôsoby útokov a potrebujem mať istotu, že tento spôsob bude ok, ešte skôr než sa pustím do tej naj-komplexnejšej časti programovania, bo potom toho bude toľko, že to už neprerobím, ani keby som chcel.
ShiraNai7
Profil
Důležité je NIKDY nevěřit hodnotám, které ti od uživatele přijdou. Jakékoliv omezení na straně klienta (dané např. prvkem formuláře) se dá obejít. To se týká všeho v $_GET, $_POST, $_COOKIES, $_FILES (názvy souborů atd) a tedy i $_REQUEST. Také HTTP hlavičky ve formě $_SERVER['HTTP_*']. Výjimkou je $_SESSION, které uživatel nemůže přímo ovlivnit (data jsou uložena na straně serveru).

Pak stačí nespoléhat na direktivu register_globals, řádně escapovat hodnoty v SQL dotazech které pocházejí uživatele a tak dále. Na internetu určitě najdeš i další rady.
Duchaplny
Profil
formulárov mám len pár a všetky sú obmedzené počtom znakov, aj tie, kde sa píšu správy.. síce 500 znakov je dosť, ale mám tam ďalšiu ochranu, aby to nebralo tagy, rôzne znaky ako "&", "$" a pod.

zo spomenutých používam len $_GET (url) a $_POST (formuláre), tam mám tiež ochranu proti rôznym znakom, dĺžka povolených znakov, podmienky..

hlavičky používam len na refresh stránky, keď napr. užívateľ zmení heslo, aby ho to odhlásilo.. dúfam, že to nie je nebezpečné riešenie:
unset($_SESSION["id"]);

ob_start();
$url="http://".$_SERVER["SERVER_NAME"]."";
$time_out=1;
header("refresh: $time_out; url=$url");
ob_end_flush();

odkazy mám inak spravené poväčšine ako ?page=stranka, príp. niekoľko & v ktorých mám ešte ochranu, aby vložená hodnota bola číslo (int), ale niektoré mám nastavené aj cez:
<a href='http:// ".$_SERVER["SERVER_NAME"]."/stranka.php'> Stránka </a> - bez medzery.
mám to kvôli neskoršiemu presúvaniu webu na inú adresu, aby sa nestalo, že nejaký odkaz nebude fungovať na novej adrese webu. Je to nebezpečné takto riešiť ?

register_globals mám zapnuté, používam to v mysql_query - $_GLOBALS["result"].
Vstupy sú ochránené buď mysql_real_escape_string alebo addslashes, správne zátvorky a pod. Nerád by som tie registre vypínal, som zvyknutý na túto formu a keď je to ochránené, tak hádam to vypínať ani nemusím nie ?
pcmanik
Profil
Duchaplny:
Register globals je od verzie PHP 5.4 zmazane. Takze ak su tvoje skripty na tomto nastaveni zavisle, prestanu fungovat a to je dost zavazny problem.
ShiraNai7
Profil
Duchaplny:
register_globals nema s $GLOBALS nic spolecneho. Pokud je register_globals aktivovano, tak lze namisto $_POST['neco'] pouzit $neco, coz muze v urcitych pripadech znamenat bezpecnostni problem.
Duchaplny
Profil
Viem, že bola taká situácia, keď som mal register_globals vypnuté a nefungovali mi SQL dotazy.

Čo presne je zlé na tomto príklade, keď mi to bez registrov nefunguje ?
$result=mysql_query("SELECT id FROM users WHERE register='1' AND name='".$name."' AND password='".$password."';",
$GLOBALS["result"]);

Neviem teraz či dobre rozumiem, mám na veľa miestach niečo takéto:
$string=mysql_real_escape_string(strip_tags($_POST["string"]));

toto mi prestane fungovať ?
panther
Profil
Duchaplny:
Čo presne je zlé na tomto príklade, keď mi to bez registrov nefunguje ?
ze promenne $name a $password neexistuji. Existuji jen $_GET['name']/$_POST['name'] a pro heslo napodobne. Ktera z techto dvou existuje zavisi na metode, jakou byl formular odeslan.

toto mi prestane fungovať ?
ne.

Nechces si o problematice neco najit a precist, kdyz vis, co mas hledat? Bude to lepsi, nez strilet od boku a hadat, co by tak mohlo fungovat a co uz ne.
Duchaplny
Profil
Čistá teória z kníh a článkov mi nestačí, potrebujem sa o tom aj s niekym porozprávať. Sme ľudia, komunikácia je prirodzená cesta a ja nie som robot, že si všetko vyčítam z kníh a som hneď múdry. Veľa krát mám problém s terminológiou, aj keď niekomu, kto s tým pracuje denne, sa zdá triviálna. Ja si vo svojom voľnom čase robím vlastný projekt, v podstate sa na ňom učím a často krát sa mu mesiac nevenujem.

Tie premenné sú inak posielané cez $_POST. Našiel som v registrácii riadok:
$password=md5($_POST["password"]);
ale nikde nemôžem nájsť $name, že by bol definovaný a teraz napr. nechápem, ako to, že funguje.

ešte sa chcem spýtať k tým registrom, hádam posledná otázka.. bude teda stačiť, ak všade dám miesto $name a $password - $_POST["name"]; a md5($_POST["password"]); a potom to bude fungovať aj bez registrov ?
panther
Profil
Duchaplny:
ja nie som robot, že si všetko vyčítam z kníh a som hneď múdry.
nerikam vse, ale zaklady tam vycist muzes. Vyse bylo naznaceno, ze mas hledat cosi o „register globals“, ale neudelal jsi to, a namisto toho se hloupe ptas, proc funguje neco, co fungovat ma, ale ty si myslis, ze to fngovat nema.

Ptej se, to je v poradku, ale az budes mit problem, diskuse ti nebude nahrazovat tvou lenost.

ale nikde nemôžem nájsť $name, že by bol definovaný a teraz napr. nechápem, ako to, že funguje.
protoze register globals. Opet, dalsi zbyteny dotaz, ktery by nemusel padnout, kdybys cetl, co ti tu ostatni pisi a pridal trochu vlastni snahy.

bude teda stačiť, ak všade dám miesto $name a $password - $_POST["name"];
ano. Nebo promenne $name a $password vubec nepotrebujes, muzes pracovat i primo s $_POST['name']
Duchaplny
Profil
Ptej se, to je v poradku, ale az budes mit problem, diskuse ti nebude nahrazovat tvou lenost.
toto by sa dalo napísať skoro na všetko.. nie je to o lenivosti, teda možno z časti, že to chcem vybaviť rovno tu, keď už to niekto spomenul, ale nebol to hlavný zámer, len sa týmto smerom rozvinula diskusia a ja som v nej pokračoval, bo ma to zaujalo. Inak vždy najskôr hľadám na nete, až potom idem sem a nechodím sem každý deň s každou prkotinou, veľa vecí si vyriešim sám.

Opet, dalsi zbyteny dotaz, ktery by nemusel padnout, kdybys cetl, co ti tu ostatni pisi a pridal trochu vlastni snahy.
keby som stále len čítal, tak by som sa možno nemusel pýtať na nič, ale úprimne som rád, že toho veľa neviem, aspoň sa môžem spýtať a tým pádom toto fórum získava podstatu. Nakoniec, načo by bolo toto fórum, keby všetci všetko vedeli..

promenne $name a $password vubec nepotrebujes
viem, že ich nepotrebujem, ale je to kratšie a šikovnejšie, než všade písať $_POST["name"]; a md5($_POST["password"]). Trochu ma aj mrzí, že registre končia, ale určite to má dobrý dôvod a určite si o nich ešte prečítam, bo budem musieť celý projekt kvôli tomu prerobiť.

Každopádne vďaka za rady, moc mi pomohli. Som rád, že existuje toto fórum.
pcmanik
Profil
Duchaplny:
keby som stále len čítal, tak by som sa možno nemusel pýtať na nič, ale úprimne som rád, že toho veľa neviem, aspoň sa môžem spýtať a tým pádom toto fórum získava podstatu. Nakoniec, načo by bolo toto fórum, keby všetci všetko vedeli..
Ano forum ziskava podstatu, ale keby si nechapal co robi register_globals. Ale ty si si to ani nepokusal zistit, prvy odkaz v googli na teba vyhodi odpoved. Myslis ze je to pomalsie, ako ked ti tu niekdo za polhodinu odpise?

Trochu ma aj mrzí, že registre končia
Nenazyvaj to prosim registre, ked nie priamo anglicky register globals, tak aspon nastavenie globalnych premennych. Registre nemaju s problematikou vobec nic spolocne.
Duchaplny
Profil
Myslis ze je to pomalsie, ako ked ti tu niekdo za polhodinu odpise?
nejde o rýchlosť, neponáhľam sa a mám radšej ľudský prístup, než čítanie dokumentácie.. keby si nemal okolo seba jediného človeka, s ktorým sa môžeš o tomto porozprávať, určite by si to bral rovnako ako ja alebo aspoň približne rovnako..

ja si inak o tých register_globals určite niečo prečítam, ale až neskôr.

Nenazyvaj to prosim registre
ok, moja chyba.. ostanem radšej u originálu - register_globals.
pcmanik
Profil
Duchaplny:
V mojom okoli tejto problematike rozumiem najviac ja, a hlavne vdaka citaniu dokumentacie... A samozrejme miestnych prispevkov. V podstate nikdy som nikoho takeho nemal, ale vdaka anglictine neni problem si to v manualy dohladat.
Duchaplny
Profil
pcmanik:
no v mojom okolí tejto problematike rozumiem len ja a ešte ani v tom nie som taký zdatný a ani v angličtine.. prekladanie dokumentácii je pre mňa na dlho.. skrátka, skôr než sa niečo dozviem, ma to prestane baviť čítať a v jazykoch, ktoré mi problém nerobia je ťažké nájsť niečo zmysluplné, takže potrebujem mať náladu na čítanie dokumentácie..

V podstate to riešiť už nemusíme, každý máme svoje dôvody, prečo sa správame, tak ako sa správame a v tomto topicu šlo hlavne o to zistiť, či musím nutne hashovať URL, aby to bolo safe alebo stačí všetko ochrániť podmienkami a nerobiť bezpečnostné diery.. na túto otázku som odpoveď dostal a zvyšok už bola voľná téma, ktorá sa odvodila od toho celého.. toto už je ale úplne OT, takže by som to rád ukončil..

Vaše odpověď


Prosím používejte diakritiku a interpunkci.

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