Archives de la liste d​e​v​@p​a​h​e​k​o​.c​l​o​u​d​

Patch récupération de l'IP de utilisateur derrière Proxy inverse

Julien Milletre (Akipe)

17/02/2024 03:04:44

Bonjour à tous,

Je me permets de vous proposer un patch qui permet de récupérer 
l'adresse IP de l'utilisateur lorsque Paheko est utilisé derrière un 
serveur reverse proxy (par exemple avec HAProxy ou Nginx Proxy Manager).

Actuellement dans cette situation, c'est l'adresse IP du serveur 
exécutant le proxy qui est détecté

Paheko détecte l'adresse IP depuis le header /REMOTE_ADDR /qui contient 
l'adresse IP de la dernière machine qui effectue la requête.

Les reverses proxys utilisent d'autres headers pour transmettre l'IP de 
l'utilisateur aux serveurs intermédiaires. Plusieurs headers peuvent 
être utilisés en fonction des proxys :

  * /HTTP_X_FORWARDED_FOR/ (qui est le standard)
  * /HTTP_CF_CONNECTING_IP/ (utilisé par CloudFlare)
  * /HTTP_X_REAL_IP/
  * /HTTP_X_CLIENT_IP/
  * ...

Le patch contient la modification de la fonction /getIP()/. Elle va 
détecter si l'un de ces headers est défini, et si c'est le cas elle 
retournera sa valeur (qui correspondra à l'IP de l'utilisateur). Si 
aucun header de proxy n'est défini, la fonction retournera la valeur de 
/REMOTE_ADDR./

Les headers de proxy peuvent contenir une liste d'adresses IP dans le 
cas où plusieurs reverses proxy sont utilisés. Il est donc possible que 
le header contienne la valeur suivante : /203.0.113.195, 192.168.2.20, 
192.168.1.30/ (la première IP correspondra toujours à celle de 
l'utilisateur).

Le but de la fonction /parseUserIpFromIpHeader(string $header_content): 
string/ est de parser correctement le header pour ne retourner que la 
première adresse IP correspondant à celle de l'utilisateur.

Vous pouvez trouver plus d'informations sur les headers de proxy dans la 
doc de Mozilla : 
https://developer.mozilla.org/en-US/docs/Web/HTTP/Headers/X-Forwarded-For

Je n'ai pas réussi à lancer les tests unitaires. Si quelqu'un peut 
m'aider à ce niveau-là, je pourrai ajouter dans le patch les tests 
correspondant aux modifications.

Bonne journée à tous.

Patch récupération de l'IP de utilisateur derrière Proxy inverse

BohwaZ/Paheko

17/02/2024 20:17:06

Hello,

je te remet ma réponse faite sur IRC au cas où tu ne l'ai pas eue :

plusieurs soucis avec ton patch

1 -> tu fait un define dans getIP() donc ça va faire une erreur si c'est
appelé plusieurs fois car on ne peut définir une constante qu'une seule
fois

2 -> il ne faut pas utiliser ces headers si l'admin sys ne l'a pas
voulu, sinon n'importe qui pourrait faire enregistrer une fausse IP
juste en envoyant le bon header

3 -> enfin, il faudrait valider l'adresse IP dans ces cas, car
REMOTE_ADDR est fiable, mais tes headers peuvent contenir n'importe quoi

donc la bonne implémentation serait : 1. rajouter une constante de
configuration (config.dist.php) TRUSTED_PROXY_IP_HEADERS par exemple qui
contienne un tableau avec la liste des headers qui sont considérés comme
fiables par l'admin sys

2. dans getIP, si cette constante n'est pas NULL, alors aller chercher
la valeur dans les headers
avec la fonction apache_request_headers()
($_SERVER n'est parfois pas rempli dans certaines configs)