Jak zjistit id z parametru pro metodu link()?

Upozornění: Tohle vlákno je hodně staré a informace nemusí být platné pro současné Nette.
krucinal
Člen | 38
+
0
-

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.

Jan Endel
Člen | 1016
+
0
-

Jednak by mě zajímalo, kde používáš link v takovémto tvaru (v php ne v latte) a jednak, co ti brání napsat link tak jak jsi sám napsal?

link('a:b:c', array('id'=>'d'));

?

Pokud se budeme držet tvého příkladu ze Zendu.

krucinal
Člen | 38
+
0
-

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
+
0
-

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íš?

Jan Endel
Člen | 1016
+
0
-

Tohle přece řeší Nette za tebe, pokud nelze jednoznačně rozeznat jaká proměnná z linku se má namapovat na jakou v action tak se zachová podle nastaveného chování.

krucinal
Člen | 38
+
0
-

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
+
0
-

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á.

krucinal
Člen | 38
+
0
-

Ochrana proti manipulaci s url. Aby si nekdo nemohl zmenit v url id. Aby sly pouzit jen url vyrobene aplikaci. Neni to radoby bezpecnost, ale naprosta nutnost.

Jan Endel
Člen | 1016
+
0
-

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
+
0
-

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
+
0
-

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.

krucinal
Člen | 38
+
0
-

Tak slava, slo to udelat celkem elegantne v routeru, takze jsem nemusel link() vubec hackovat.
Stacilo se na to vyspat :)