48017e895a086966f5e81a602ccbdf3e697217e0
Die Pruefung zerlegte beide Adressen mit explode(":") und verglich die ersten
vier Felder. Bei IPv4 entsteht dabei nur ein Feld, die uebrigen drei sind
undefiniert und null == null ist wahr - die Bedingung schrumpfte damit auf
REMOTE_ADDR == SERVER_ADDR. Kaeme je ein Reverse Proxy auf denselben Host,
haette das jeden Zugriff aus dem Internet als lokal gelten lassen.
Neu:
- LOCAL_NETWORKS als sichtbare Liste, derzeit 192.168.179.0/24.
- ipInNetwork() vergleicht binaer ueber inet_pton, also unabhaengig von der
Schreibweise. "2001:0db8:a:b::9" gilt jetzt zurecht als dasselbe /64 wie
"2001:db8:a:b::9" - vorher fiel dieser Client durch.
- Das IPv6-/64 wird weiterhin aus SERVER_ADDR abgeleitet, da der Provider das
Praefix vergibt.
- REMOTE_ADDR wird mit filter_var geprueft; "192.168.179.44 evil" galt vorher
wegen str_starts_with als lokal.
- Auf IPv6 abgebildete IPv4-Adressen (::ffff:192.168.179.44) werden
normalisiert. Ein Dual-Stack-Socket meldet LAN-Clients so; bisher fielen
sie durch.
- $_SESSION["local"] wird in beiden Zweigen gesetzt, nicht nur im positiven.
Verhaltensaenderung: Anfragen, deren Absender gleich SERVER_ADDR ist - etwa
127.0.0.1 - gelten nicht mehr automatisch als lokal. Im Repo ruft nichts die
Seite ueber HTTP vom Server selbst auf. Wird das doch gebraucht, gehoert das
betreffende Netz in LOCAL_NETWORKS.
Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
Description
No description provided
17 MiB
Languages
PHP
42.8%
JavaScript
31.5%
Python
12.6%
CSS
11.1%
HTML
1.7%
Other
0.3%