Tracy debugger nefunguje po připojení na cloudflare

DodiseK
Člen | 56
+
0
-

Zdravím, rád bych se zeptal, zda už někdo řešil problém, kdy vlastně přestane fungovat a zobrazovat se Tracy Debugger poté, co doménu napojím na CloudFlare.

Felix
Nette Core | 1183
+
0
-

Zatim jsem se s tim nesetkal.

Marek Bartoš
Nette Blogger | 1146
+
0
-

By default se zobrazuje snad jen na localhostu, jinde je z bezpečnostních důvodů debug mód (a s ním i debug bar) vypnutý.

V kombinaci s cloudflare mohl přestat fungovat debug mód zapnutý na základě IP adresy, zkus si jej natvrdo zapnout

$configurator->setDebugMode(true);
$configurator->enableTracy();
Domm
Člen | 4
+
0
-

Cloudflare dělá spojku mezi tebou a webem.

Tzn. na ten web pak fyzicky přistupuje jen cloudflare pod jeho IP, a všichni návštěvníci webu vč. tebe jako vývojáře přistupují k němu.

Musíš to buď povolit úplně jak píše tady @Mabar nebo si najít jinou cestu, třeba v podobě odděleného vývojového prostředí od produkčního.

baraja
Nette Blogger | 29
+
-6
-

Ahoj,

řeším ten samý problém a rád bych k tomu napsal pár komentářů z praxe.

Variantu, kdy se povolí Tracy pro všechny requesty je extrémně nebezpečná a prosím, nikdy to nenabádejte programátory udělat. Zrovna minulý týden jsem díky tomuto přístupu viděl Tracy bar na hlavní stránce konkurenční firmy a díky DIC jsem byl schopen získat přístup k databázi a dělat prakticky cokoli. Je to proti jakékoli bezpečnosti.

IP adresa přistupující k serveru je skutečně z Cloudflare, protože proxují veškerý provoz, jak správně píše @Domm. Jako řešení se tedy hodí IP adresu v takovém případě přepsat.

Běžně se na to používá dvojice hlaviček X-Forwarded-For a X-Real-IP nebo superglobální proměnná $_SERVER["HTTP_X_FORWARDED_FOR"], která ale může být v některých případech podvržena. Detaily jsem podrobně popsal v článku Zjištění IP adresy uživatele v PHP.

Osobně navrhuji přímo v Nette detekovat Cloudflare prostředí přes existenci proměnné $_SERVER['HTTP_CDN_LOOP'] s hodnotou 'cloudflare'. V takovém případě totiž samotná služba předává reálnou IP adresu uživateli v proměnné $_SERVER['HTTP_CF_CONNECTING_IP'] a to naprosto bezpečnou cestou, která nelze na rozdíl od $_SERVER["HTTP_X_FORWARDED_FOR"] podvrhnout (resp. všechno se dá podvrhnout, ale musíte k tomu mít obrovské know-how, které tu má jen pár lidí).

Navrhuji proto celý problém vyřešit tímto způsobem: https://github.com/…trap/pull/66, snad to nebude pro @DavidGrudl moc velký BC break nebo specifická implementace. Na druhou stranu Cloudflare používá snad celý internet, tak by si to Nette zasloužilo nativně podporovat.

Moc děkuji.

David Matějka
Moderator | 6445
+
+1
-

@baraja ahoj, tohle má úplně stejný problém jako X forwarded for. Všechny hlavičky se náplní do toho $_SERVER s prefixem http. Takže když pošleš hlavičku cdn-loop a cf-connecting-ip, tak si (dle toho tvého PR) budeš moct zapnout debug mode.

Není možné bezpečné automaticky v nette detekovat originální IP adresu bez toho, aby bylo někde nastavené, kde je uložená.

Felix
Nette Core | 1183
+
0
-

baraja napsal(a):

Osobně navrhuji přímo v Nette detekovat Cloudflare prostředí přes existenci proměnné $_SERVER['HTTP_CDN_LOOP'] s hodnotou 'cloudflare'. V takovém případě totiž samotná služba předává reálnou IP adresu uživateli v proměnné $_SERVER['HTTP_CF_CONNECTING_IP'] a to naprosto bezpečnou cestou, která nelze na rozdíl od $_SERVER["HTTP_X_FORWARDED_FOR"] podvrhnout (resp. všechno se dá podvrhnout, ale musíte k tomu mít obrovské know-how, které tu má jen pár lidí).

Ahoj, vzdyt si defacto napsal navod jak to udelat. Premyslim, co je na tom tezkeho podvrhnout i toto.

  • Zjistit, ze web bezi za CF? Done (napr. maji seznam IP adres)
  • Zjistit, ze se jedna o Nette? Done (napr. forma generovani id formularu)
  • Zjistit, jak interne funguje Tracy? Done (diky tvemu PR)

Nebo jsi to myslel nejak jinak?

David Matějka
Moderator | 6445
+
+5
-

@Felix tak pokud běží na CF, tak by byl i navzdory tomu PR v bezpečí (protože CF ty hlavičky přepíše), ale udělalo by to díru do všech ostatních webů :)

Felix
Nette Core | 1183
+
0
-

@DavidMatějka I see. To dava smysl. :-)

baraja
Nette Blogger | 29
+
0
-

@DavidMatějka @Felix Ok, už chápu, že nelze takto bezpečně zjistit IP adresu, protože by šlo na webech bez CF podvrhnout hlavičku a tvářit se, že aplikace přes CF běží a vnutit tak například lokální IP adresu, kde se Debug mode automaticky spustí.

Zároveň ale přemýšlím, jak na produkci debug mód jednoduše zapínat. Velmi často potřebuji na produkci vyřešit nějaký problém, který se děje jenom tam (typicky při deployi nového webu na nové prostředí) a když není dostupný Debug mód, tak to znamená neustálé stahování logů na localhost a prohlížení lokálně, nebo čtení přes Terminál přímo ze serveru (které je velmi nepohodlné) oproti tomu, když je vidět Tracy BlueScreen přímo.

Existuje tedy nějaké jednoduché řešení, jak toto řešit? Pracuji v různých týmech lidí, kde je prakticky nereálné vysvětlovat nějaké komplikované postupy, jak si například v prohlížeči nastavit cookies (určitě znáte řadové frontenďáky, kteří jenom buší HTML/CSS a další technologie jdou mimo ně) a tak si myslím, že by mělo existovat nějaké systémové řešení.

Jestli se pletu a je současné chování správně a mělo by se to řešit nějak jinak, tak se omlouvám.

Díky.

Marek Bartoš
Nette Blogger | 1146
+
0
-

Technicky vzato jim tu cookie můžeš vygenerovat tlačítkem v administraci, které by jim cookie zaslalo a zároveň ji uložilo na disk, třeba vedle bootstrapu. Ten pak bude ze souboru číst povolené hodnoty dané cookie a podle ní zapne debug mód.

Univerzální řešení bohužel není – to co navrhuju musí běžet bez jakékoli služby obsažené v DIC, který v té době není vytvořený (pokud bys tedy neměl druhý container nezávislý na debug módu) a též bez služby nepoběží na read-only FS

IP adresy nikdy ideální řešení nebudou – proxy servery a virtuální prostředí neumožňují problém vyřešit univerzálně a i kdyby se nepoužívaly, tak je tu pořád možnost podvrhnout svou IP adresu. Sice ti nepřijde odpověď, ale pořád je tu možnost spustit nějakou operaci, která je závislá jen na debug módu.

Editoval Mabar (7. 5. 2020 13:22)

CZechBoY
Člen | 3608
+
0
-

Cookie nebo třeba adresa schovaná za dynamicky generovaným tokenem. Nemusíme se snad omezovat na to co umí Tracy.
Budeš mít třeba url pls-debug/$njfnsdjkfndsjknfjd, který ti nasetuje třeba do session debug_mode=1 a ty potom v bootstrap.php podmíníš zapnutí debug modu (např.) na základě této hodnoty ze session $debugger->setDebugMode($_SESSION['debug_mode']);

Duch.Veliky
Člen | 68
+
0
-

Pokud to někdo řešil jako já nyní, tak celý problém se skrývá v tom, že CLOUDFLARE překládá IP na svou, ale do hlavičky předává i IP adresu klienta. Stačí si vypsat print_r($_SERVER);

Je tam nová proměnná $_SERVER[‚HTTP_X_FORWARDED_FOR‘] a pak už to je jen drobrá úprava indexu :)