RFC – flexibilní validace IPV6 v Bootstrap::setDebugMode()

m.brecher
Generous Backer | 863
+
0
-

Ahoj,

Můj poskytovatel internetového připojení uvádí ve své administraci dvě pevné IP adresy takto (čísla jsem pozměnil)

IPV4: 22.305.331.880/32
IPV6: 5d77:5521:e000:g33::/64

Při připojování na různé servery se někdy použije IPV4, někdy IPV6 podle serveru. Pokud server použije IPV4, problém s nastavením debug mode není:

$configurator->setDebugMode('22.305.331.880');   // IPV4 OK

Pokud server použije IPV6, pak se druhá polovina IPV6 cyklicky mění a musím dokolečka aktualizovat Bootstrap.php – třeba takto:

$configurator->setDebugMode('5d77:5521:e000:g33:89ae:2776:1cbe:4902');   // full IPV6

Zkusil jsem zadat jenom první neměnnou polovinu IPV6, to ale stávající implementace Bootstrap nepodporuje

$configurator->setDebugMode('5d77:5521:e000:g33');   // works not

Druhá půlka IPV6 se mění kvůli zajištění soukromí, to bych rád využíval trvale. Současně bych potřeboval, aby metoda $configurator->setDebugMode() zvládla validovat kombinaci IPV4 a IPV6 adresy s tím, že u IPV6 by se validovala jenom první polovinu která se nemění a druhá polovina IPV6 by se ignorovala. Předpokládám, že podobný problém s IPV6 by mohlo mít více vývojářů.

Ignorování druhé poloviny IPV6 při validaci by se mělo nějak označit, aby se předešlo BC breaku, např:

a) speciálním slovem – např. #ignore místo druhé poloviny

$configurator->setDebugMode(["22.305.331.880", "5d77:5521:e000:g33#ignore"])

b) přidaným parametrem v metodě:

$configurator->setDebugMode(['22.305.331.880', '5d77:5521:e000:g33'], ignoreIpv6Suffix: true)

Editoval m.brecher (18. 4. 15:46)

nightfish
Člen | 516
+
+4
-

Nebylo by lepší podporovat zápis IPv4 a IPv6 adres v CIDR notaci?
Tzn. zadáš třeba 5d77:5521:e000:f33::/64 a vyhoví libovolná adresa z rozsahu 5d77:5521:e000:0f33:0000:0000:0000:0000 – 5d77:5521:e000:0f33:ffff:ffff:ffff:ffff?

Je to, pravda, složitější na implementaci než stávající porovnávání stringů, ale zase tím umožníš zápis bloků adres bez nutnosti přidávat suffixy typu #ignore a nebo nové argumenty pro setDebugMode().

V ideálním světě by na to v Nette (/utils?) vznikl value object, který by uměl IP adresu (obou typů) reprezentovat a provádět nad ní dotazy typu „je tato adresa ve tvém rozsahu“?

Marek Bartoš
Nette Blogger | 1260
+
+3
-

setDebugMode() přijímá jako parametr bool. Mnohem čistší řešení je udělat helper metody vracející bool a kombinovat je.

$configurator->setDebugMode(Environment::hasIPv4(['127.0.0.1']) || Environment::hasIPv6(['::1']));

Editoval Marek Bartoš (18. 4. 18:23)

Marek Bartoš
Nette Blogger | 1260
+
+1
-

Btw, jsou mnohem praktičtější řešení zapínání debug módu. Na lokálu mám debug vždy zapnutý přes env proměnnou a na serveru si ho můžu zapnout přes cookie na kliknutí v administraci.

$configurator->setDebugMode(
	Environment::isEnvDebug()
	|| Environment::isCookieDebug($cookieStorage),
);
m.brecher
Generous Backer | 863
+
-2
-

@nightfish

Nebylo by lepší podporovat zápis IPv4 a IPv6 adres v CIDR notaci? Tzn. zadáš třeba 5d77:5521:e000:f33::/64 …

Ano, to mě přijde jako dobrý nápad a nemusíme zavádět speciální hodnotu. U IPV4 myslím není potřeba nic řešit a u IPV4 by se vedle kompletního stringu IPV6 povolil i zápis v notaci:

5d77:5521:e000:f33::/64

Pak by stačilo v jednodušším řešení ověřit, zda string IP adresy končí ::/64 a pokud ano, tak porovnat zda string IP adresy začíná stejným stringem jako zadaná IPV6 minus poslední 4 znaky.

V preciznějším případě by se mohl formát IPV6 adresy ještě předtím validovat. Ale 100% validace nebude nutná, protože by možná stačilo ověřit, že obsahuje 4 alfanum řetězce oddělené třemi dvojtečkami.

Takže pro případ, kdy poskytovatel připojení dodá fixní IPV4 a IPV6 by se jednoduše uvedlo v konfiguraci:

$configurator->setDebugMode([
    'secret-cookie@22.305.331.880',            // IPV4
    'secret-cookie@5d77:5521:e000:g33::/64'    // IPV6 - statická část
]);

a úprava kódu v Bootstrap.php by byla jednoduchá. A problém to řeší.

m.brecher
Generous Backer | 863
+
0
-

@MarekBartoš

setDebugMode() přijímá jako parametr bool.

Jenže potřebujeme vedle IP adresy obvykle přidat ještě nette-debug cookie před zavináč. Dnes se stejně IP adresa předaná Bootstrap::setDebugMode() nevaliduje a není to nutné. Prostě buďto souhlasí se skutečnou IP nebo ne. Řešení které navrhnul @nightfish mě přijde nejlepší.

m.brecher
Generous Backer | 863
+
0
-

@MarekBartoš

setDebugMode() přijímá jako parametr bool. Mnohem čistší řešení je udělat helper metody vracející bool a kombinovat je.

máš to vymyšlené pěkně, ale do Frameworku jako základní řešení se myslím víc hodí to, které navrhnul @nightfish, a Tvoje řešení s boolean Helpery by použil ten, kdo by chtěl něco lepšího.

Jak píšeš, že validuješ přístup na serveru pomocí cookie kliknutím v administraci, to by mě zajímalo, protože já nette-debug cookie zadávám ručně v prohlížeči a to je pakárna. Kdyby Jsi mohl poslat odkaz na nějaké hotové řešení byl bych vděčný. Díky

David Grudl
Nette Core | 8218
+
0
-

Tohle se použít nedá? https://github.com/…/Helpers.php#L40

m.brecher
Generous Backer | 863
+
0
-

@DavidGrudl

Tohle se použít nedá? https://github.com/…/Helpers.php#L40

Nette\Http\Helpers::ipMatch() jsem krátce vyzkoušel (čísla jsou pozměněná) a matchne 100%

první argument – reálná ip adresa
druhý argument – adresa v reálném tvaru nebo speciální CIDR notaci

// IPV4:

Helpers::ipMatch('22.305.331.880', '22.305.331.880');   // true

Helpers::ipMatch('22.305.331.880', '22.305.331.880/32');   // true

Helpers::ipMatch('5d77:5521:e000:g33:89ae:2776:1cbe:4902', '5d77:5521:e000:g33:89ae:2776:1cbe:4902');   // true

Helpers::ipMatch('5d77:5521:e000:g33:89ae:2776:1cbe:4902', '5d77:5521:e000:g33::/64');   // true

Helpers::ipMatch('83.208.252.107', 'invalid');    // TypeError

Použití ipMatch() řeší existující problém s dynamickou změnou druhé poloviny IPV6 adresy, validuje platnost zápisu IP v CIDR notaci, při použití neplatné CIRD notace vyhodí TypeError, který by se zachytil a IP by se vyhodnotila jako nematchnutá.

Při použití ipMatch() by zápis v Bootstrap.php pro dvojici IPV4 + IPV6 vypadal takto:

$configurator->setDebugMode([
    'secret-cookie@22.305.331.880',            // IPV4
    'secret-cookie@5d77:5521:e000:g33::/64'    // IPV6 - CIDR notace
]);

To je ideální.

Editoval m.brecher (19. 4. 14:32)