Mám skvělý pocit z právě vydané verze Nette 2.2.3, protože se tam podařilo vychytat řadu drobností, počínaje chytřejším rozpoznání chyb u nativních funkcí, přes výstižnější chybové hlášky DI kontejneru, až po různé novinky (viz release notes). Už jsem ji nasadil na všechny své weby a běží výborně.
Rád bych vypíchl 3 užitečné novinky. První se týká Latte a jde o funkci
invokeFilter()
, kterou můžete volat filtr i mimo šablonu:
$latte = new Latte\Engine;
$latte->addFilter('upper', 'strtoupper');
$upper = $latte->invokeFilter('upper', array('abc')));
// obdoba {'abc'|upper} v šabloně
Druhá novinka se týká Tracy. Ta
nyní dokáže logovat chyby jako je E_NOTICE
v plné náloži
(tj. s HTML souborem), jako když loguje výjimky. Které chyby má takto
logovat nastavíte do proměnné $logSeverity
:
Tracy\Debugger::$logSeverity = E_NOTICE | E_WARNING;
Třetí novinka souvisí s bezpečností. Třída Configurator
má metodu setDebugMode()
, pomocí které určujete, zda aplikace
poběží v produkčním nebo vývojářském režimu. Raději jí nikdy
nepředávejte argument true
, může se pak snadno stát, že to
deploynete na ostrý server a máte hned bezpečnostní kráter. Správné je
jako argument předat IP adresy, pro které chcete vývojářský režim na
ostrém serveru povolit:
$configurator->setDebugMode('23.75.345.200');
Jenže IP adresy se mohou měnit a dostane ji někdo jiný. Proto je nově
možné přidat ještě pojistku v podobně cookie. Do cookie nazvané
nette-debug
si uložíte tajný řetězec (buď funkcí setcookie
nebo pomocí vývojářského nástroje prohlížeče, každopádně
nezapomeňte na příznak httpOnly), například mysecret
a
necháte Configurator, aby ověřoval i jej. Teprve sedí-li IP adresa
i hodnota v cookie, bude aktivován vývojářský režim:
$configurator->setDebugMode('mysecret@23.75.345.200');
Čtvrtá novinka ze tří se týká DI
kontejneru a je velmi dobře skrytá. Dovoluje nastavit, které třídy
vynechat z autowiringu. Typickým kandidátem je
Nette\Application\UI\Control
, kterého vám může DI kontejner
cpát třeba do konstruktoru formuláře. Seznam ignorovaných tříd předáte
metodě ContainerBuilder::addExcludedClasses()
. K té se dostanete
například v bootstrap.php
:
$configurator->onCompile[] = function($configurator, $compiler) {
$compiler->getContainerBuilder()->addExcludedClasses(array(
'stdClass',
'Nette\Application\UI\Control',
));
};
A do pětice všeho dobrého: při vývoji můžete narazit na upozornění
Possible problem: you are sending a HTTP header while already having some data in output buffer. Try OutputDebugger or start session earlier.
To se objeví, když se snažíte odeslat HTTP hlavičky, a ono to sice ještě
jde, nicméně aplikace už nějaký výstup předtím odeslala, jen ho zachytil
output buffer.
V takové situaci je nejlepší nastartovat OutputDebugger
a zjistit, odkud se výstup posílal a předejít tomu. Od verze 2.2.3 máte
také možnost toto dobře míněné upozornění potlačit pomocí proměnné
Nette\Http\Response::$warnOnBuffer
. Třeba opět z bootstrapu:
$container->getByType('Nette\Http\Response')->warnOnBuffer = false;
Komentáře
Jakub Vrána #1
Secret by měl být hash. Pokud jsou zdrojové kódy veřejné nebo uniknou, tak by to útočníkovi nemělo dát munici navíc. IP adresa je v tom případě zbytečná.
David Grudl #2
#1 Jakube Vráno, nad tímhle jsem dlouho přemýšlel a nakonec se rozhodl hash nepoužít. Důvodem je snazší nasazení a fakt, že hash se musí počítat při každém požadavku, takže by tam stejně nebyla moc silná funkce. Unik kódu představuje zřejmě větší problém, než únik tohoto tokenu.
Vazbu na cookie beru jako méně silnou ochranu než vazbu na IP, takže určitě to chci mít v kombinaci.
Jakub Vrána #3
Hashovací funkce může být velmi rychlá, protože vstup může být dlouhý, vývojář si ho nemusí pamatovat.
Petr #4
Ahoj,
hezké, hlásím, že upgrade z 2.2.2 proběhl zcela bez problémů. Jen jak bude fungovat
pro nastavení více ip adres? Mají se napsat odděleně čárkou?
Díky moc,
Petr
David Grudl #5
#4 Petře, buď jako pole
['secret@ip', 'secret2@ip2']
nebo řetězec oddělený čárkami či mezerami.Felix #6
Můžu se zeptat jak se ten OutputDebugger používá? Nenašel jsem žádný přiklad, ani test. =/
David Grudl #7
#6 Felixi, hned po načtení autoloadingu v bootstrapu zavolej
Tracy\OutputDebugger::enable()
a vypíše se ti přehled, kde a co aplikaci vypisuje.Ondra Votava #8
A da se nejak vystup OutputDebbugeru nasmerovat do DebugBaru?
Tento článek byl uzavřen. Už není možné k němu přidávat komentáře.