RFC – flexibilní validace IPV6 v Bootstrap::setDebugMode()
- m.brecher
- Generous Backer | 871
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 | 518
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 | 1274
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 | 1274
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 | 871
@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 | 871
@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 | 871
@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
- m.brecher
- Generous Backer | 871
@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)