Změna parametrů v URL – zbytečné generování 500 na produkci

emololftw
Člen | 79
+
0
-

Dobrý den,

chtěl bych Vám popsat problém co mne trápí a přijít si pro odbornější radu.

Presenter klasicky obsahuje továrničku z onsuccess callable parametrem:

	public function createComponentMujFiltr(): Nette\Application\UI\Form
{
    return $this->mujFiltr->createSimple(
        function ($s) {
            $this->redirect('this', [
                'device_category' => $s->device_category,
                'shiftInterval' => $s['shiftInterval']
            ]);
        },
        [
            'device_category' => $this->getParameter('device_category'),
            'shiftInterval' => $this->getParameter('shiftInterval')
        ]
    );
}

Jak si lze všimnout, první parametr funkce createSimple je klasický předání parametrů, ale druhý parametr je POLE, které obsahuje defaultní hodnoty, které poté nasetuji do různých selectů. Jelikož se potvrdí filtr (klasický formulář) a chci aby uživatel operoval se zadanými daty.

Avšak pokud se formulář odešle, vše funguje bez problému. Ale pokud v url v parametru (např: device_category), který je typově nastaven na INT přidá char např.: **135s87 **tak nette vyhodnotí TypeError což je v pořádku, ale jak zamezit tomu, abych na produkčí verzi zbytečně negeneroval 500 errory když se někdo bude „nudit“.

Nyní to řeším statickým Helperem kam nasetuji z presenteru** $this->getParameters()** a výstup mam validovaný v metodě parametersHelper::g(‚device_category‘). Další způsob co jsem aplikoval je, že v ErrorPresenteru zachytávám TypeError a redirectoval jsem na ověřenou stránku bez chyby (default :Front)

Chtěl bych Vás požádat jestli je tento způsob dostačující nebo jak se podobný problém se setování defaultních hodnot aplikuje.

Děkuji mnohokrát za Váš čas.

Editoval emololftw (29. 3. 2021 13:17)

Marek Bartoš
Nette Blogger | 1146
+
0
-

Nette při vyhazování 4×x a 500 rozlišuje mezi vývojářským a produkčním módem. Uživatelský vstup vyhazuje běžně 500 pouze ve vývojářském módu. Jedná se však o výjimky (např. BadRequestException), TypeError je chyba v kódu a měla by se opravit. Vyhazuje chybu kód Nette nebo tvůj kód? Stack trace (Tracy redscreen) by případně dovedla říct více.

emololftw
Člen | 79
+
0
-

Mabar napsal(a):

Nette při vyhazování 4×x a 500 rozlišuje mezi vývojářským a produkčním módem. Uživatelský vstup vyhazuje běžně 500 pouze ve vývojářském módu. Jedná se však o výjimky (např. BadRequestException), TypeError je chyba v kódu a měla by se opravit. Vyhazuje chybu kód Nette nebo tvůj kód? Stack trace (Tracy redscreen) by případně dovedla říct více.

Děkuji moc za pohotovou odpověď. TypeError se generuje právě díky nasetování defaultních hodnot skrze druhý parametr create (kde jsem původně měl nastaveno přímo $this->getParameter()).

Parametr v url je vybrán ze selectboxu. Takže když dojde k přepsání hodnoty v URL je automaticky mimo range např.: https://ctrlv.cz/wcPD

Problém dosavaď řeším, že nesetuji setDefaults přímo z getParametr, ale mám Helper. Proto když mám prvek addInteger a jeho hodnotu předávám pomocí URL vyskočí TypeError když je kdokoliv schopen změnit parametr např.: z 133 na 1s33

Marek Bartoš
Nette Blogger | 1146
+
0
-

Z routeru parametry dostaneš jako string – cokoli v routě je totiž string (nebo pole stringů v query).

Parametry si buď můžeš přetypovat sám ve filtru routy, přijímat skrze action/render metodu presenteru, pro které Nette parametry přetypuje, nebo si je přetypovat sám.

Osobně používám druhou možnost, v tvém případě tedy actionDefault(int $device_category, int $shiftInterval);. Že Nette vyhodí výjimku/4×x zajistí právě typy, které si Nette přečte. V případě, že očekáváš int, tak se ověří, zda je string z routeru numerický (přetypuje se) nebo není (vyhodí se výjimka)

Datový typ se dá případně specifikovat i přímo v routě pomocí regexu, ale chová se to jinak – routa vůbec nematchne a budou se zkoušet ty následující.