Jak zjistit id z parametru pro metodu link()?
- krucinal
- Člen | 38
Omlouvam se za mozna hloupy dotaz. Jsem zacatecnik a v nette se teprve
rozkoukavam, ale nevim jak na to.
Zajimalo by me, jestli lze nejak ziskat udaje:
presenter,akce,id z parametru, ktere mam k dispozici pred
volanim metody link().
Mym zamerem je tuto metodu prekryt v mem basepresenteru a do predavanych argumentu doplnit neco co vychazi z techto udaju. Rozebrat $destination bych jeste dokazal, ale na ziskani parametru ‚id‘ jsem kratky.
V ZF jsem byl zvykly delat link jako
$viev->url(array('module'=>'a','controller'=>'b', 'action'=>'c', 'id'=>'d'))
V Nette je to ale vsechno jinak a neni pevne dane jak to zapisovat. Co jsem okoukal, tak to muze byt budto
link('Nejaky:cil', array('nazev'=>$hodnota,...))
to by bylo jeste ok, ale pak to muze byt taky
link('Nejaky:cil', array($hodnota1, $hodnota2, $hodnota3...))
a to uz je problem, protoze nazvy parametru se z toho udelaji podle uvedenych nazvu v parametru akce na kterou vede $destination a tady jsem skoncil. Vubec nevim, jak z toho poznat co je (nebo spis bude) cast, kterou pak v presenteru ziskam pres $this->getParameter(‚id‘)
Nenapadne nekoho jak to jednoduse vyresit? Diky za kazdy napad.
- krucinal
- Člen | 38
V takovem tvaru jsem to jeste nikde nepouzil, jen jsem zatim zkoumal jak
funguje metoda link() a jakymi ruznymi zpusoby umi zpracovat parametry.
Me osobne nic nebrani do linku psat argumenty v tomto tvaru
(array(‚id‘=>‚d‘)..), ale o to mi ani tak nejde. Jde mi o to, aby
se link() choval vzdycky stejne at dostane parametry v jakemkoliv podporovanem
tvaru a aby byl 100% kompatibilni s nette metodou link().
Chci aby kdokoliv kdekoliv v projektu mohl pouzit link at uz v php nebo
v latte a nemusel stale myslet na to ze ma do parametru neco dalsiho
pridat.
- Filip Procházka
- Moderator | 4668
Mám pocit, že hledáš persistentní parametry
Co se týče metody link(), tak ta se chová velice konzistentně a celé její chování jsi popsal v prvním příspěvku. Není na tom nic magického. V čem se prosímtě ztrácíš?
- krucinal
- Člen | 38
Persistentni parametry jsou prijemna vec. O te jsem nevedel. Dik za info. Nicmene neni to co hledam. Asi jsem stale nepochopen. Konkretne chci k url kazdeho jednoho odkazu v celem projektu pridavat nejaky kontrolni hash, ale jen v pripade, ze v tom url existuje parametr ‚id‘ a ten hash chci vyrabet mj z toho id. Chtel jsem udelat neco takoveho:
public function link($destination, $args = array())
{
$args = doPole // $args prevest na array
$args['hash'] = UdelejHash(modul, presenter, action, id); // tady chci ten novy parametr vyrobit z techto udaju
return parent::link($destination, $args);
}
Jestli to nekde nejde primo zjistit, neslo by to zpetne vytahnout z hotoveho url? Nejak takhle?
public function link($destination, $args = array())
{
$link = parent::link($destination, $args); // udelat link nanecisto
$parametry = vytahnout parametry z $link
if($parametry['id'])
{
$args['hash'] = UdelejHash($parametry);
}
return parent::link($destination, $args); // znovu vyrobit link obohaceny o muj hash
}
Kdyby sly vytahnout z url zpetne vsechny parametry, tak by to bylo uplne nadherne.
Dalsi cestou je pochopitelne na tyto potreby zavest vlastni metodu a zmenit si pravidla hry, ale prijde mi to skoda, protoze se mi osobne funkcionalita link() v nette docela zamlouva a rad bych ji zachoval.
- Filip Procházka
- Moderator | 4668
Já bych tě poprosil, abys mi vysvětlil, na co je to dobré, protože mi přijde, že tam ztvárníš nějakou rádoby bezpečnostní feature, která bude ve výsledku úplně zbytečná.
- Jan Endel
- Člen | 1016
Je to rozumné, ale IMHO na špatném místě. Potom bude zapotřebí v každé akci hlídat, jestli vygenerovaný kód skutečně odpovídá proměnným. Někdy je to dokonce trošku kontraproduktivní (měním si na cizích aplikacích url u stránkování, pokud mají špatně vyřešený paginátor – příklad). Být tebou raději bych šel cestou kontrolování proměnných na základě uživatelských práv/rozsahu id/dalších pravidel. Jednak se vyhneš znásilňování metody link() a jednak tvůj kód bude pro spoluprogramátory mnohem čitelnější.
- krucinal
- Člen | 38
Do url nema co kdo rucne zasahovat. Alespon ne v kritickych castech aplikace kde jde o bezpecnost dat. Tahle ochrana ma byt posledni bastou v pripade, ze programator opomene (popr. se uplne vyprdne) na kontrolu opravneni v okamziku kriticke operace (napr. zobrazeni detailu nejakeho zaznamu/editace/mazani apod.). Dalsi vec ktera je moji nocni murou jsou utoky CSRF, proti kterym se chci nejak branit.
Nicmene nekde v jinem vlaknu jsem narazil na podobne tema a byl tam zminovany routing. Ten jeste nemam nastudovany, ale tusim ze by to slo vyresit v nem. Zkusim se na to vyspat a pustim se do studia routingu :)
- Filip Procházka
- Moderator | 4668
Tedy, v takovém případě bych tě chtěl upozornit, že děláš zbytečnost. Tvoje aplikace má být napsaná tak, aby manipulace s url nevadila. Proč by vůbec měla vadit?
V routeru nastavíš masku, která bude směrovat určité tvary url na určité presentery. Tyto presentery pak musí samy kontrolovat oprávnění na čtení na začátku a oprávnění na zápis/úpravu při akci. Příklad.
Pokud potřebuješ ochranu proti CSFR, protože někde něco mažeš, tak použij formuláře, to je standard. Pokud přesto trváš na použití odkazu, tak musíš generovat rozumně dlouhý bezpečnostní token (4–5 znaků úplně stačí), který budeš mít uložený v session a který budeš kontrolovat.
Jakékoliv manipulativní akce se standardně dělají pomocí signálů. Byl vytvořen požadavek, na automatické generování CSFR ochrany pro signály, ale zatím byl odložen na později, protože je to složité téma.
Tedy ve zkratce: tím, že budeš uživateli zakazovat sahat do url, jenom poukazuješ na fakt, že nejsi schopný aplikaci dobře zabezpečit. Tohle je paranoia. Nedělej to.