Sida 1 av 1

Nån duktig på PHP här

Postat: 3 juni 2024, 19:27:25
av TomasL
Min hemsida ebaman har kraschat, efter en uppdatering.
Är i kontakt med utvecklaren i fråga, dock har han inte återkommit ännu.

Koden som orsakar kraschen ser ut så här

Kod: Markera allt

self::$ipaddress = $ip ? $ip : filter_input(INPUT_SERVER, 'REMOTE_ADDR', FILTER_VALIDATE_IP);
             if (!self::$ipaddress) {
                 die(' 403 Not Authorised, no or spammy IP address (' . self::$ipaddress . ')');
                 exit;
             }
Och ja vad som händer är just "403 Not Authorised, no or spammy IP address ()"

Uppenbarligen så funkar det inte med att läsa av ip-adressen, så några förslag

Re: Nån duktig på PHP här

Postat: 3 juni 2024, 19:45:59
av TomasL
Har konstaterat att variabeln "REMOTE_ADDR" innehåller min lokala IP, så uppenbarligen är det något syntaxfel i ovanstående funktion.

Re: Nån duktig på PHP här

Postat: 3 juni 2024, 19:56:22
av rvl
Ungefär noll erfarenhet av just PHP, men det sticker ut att just REMOTE_ADDR är omgiven av "fnuttar", ska det verkligen vara så?

Re: Nån duktig på PHP här

Postat: 3 juni 2024, 19:58:46
av TomasL
Har nog hittat det, i början av funktionen skall IP-adressen hämtas

Kod: Markera allt

$ip = filter_input(INPUT_SERVER, 'HTTP_CLIENT_IP', FILTER_VALIDATE_IP);
Problemet verkar vara att HTTP_CLIENT_IP inte existerar i $_server.

Är det webläsaren som sätter denna variabel, eller servern?

rvl, ja tydligen, det är ett variabelnamn i $_server

Re: Nån duktig på PHP här

Postat: 3 juni 2024, 20:11:50
av mrfrenzy
Det har alltså slutat fungera efter uppdatering till senaste PHP?
Nedgradera till en version av PHP som stödjs av mjukvaran, och vänta tills de fixat stöd för den nyaste.

Ibland om det är en säkerhetsuppdatering kan man behöva gå till en äldre version tillfälligt.
Exempelvis: mjukvaran stödjer PHP 7.3 och 8.1, du uppgraderade just till 8.2 för det är ett säkerhetshål i 8.1
Då får du byta till "den gamla stabila 7.3" så länge.

Re: Nån duktig på PHP här

Postat: 3 juni 2024, 20:15:12
av TomasL
Nä, jag uppdaterade Joomla mm.
PHP-versionen är inte ändrad

Re: Nån duktig på PHP här

Postat: 3 juni 2024, 20:19:27
av mrfrenzy
Då är det antagligen en plugin som inte är kompatibel med senaste Joomla.
Man måste läsa kompatibilitetslista för alla plugins innan uppdatering.
Man måste göra backup på databas och filstruktur före uppdatering så man enkelt kan återställa allt som det var innan.

Re: Nån duktig på PHP här

Postat: 3 juni 2024, 20:21:56
av TomasL
Den är kompatibel.
problemet är att fältet HTTP_CLIENT_IP saknas i $_server

Re: Nån duktig på PHP här

Postat: 3 juni 2024, 20:29:33
av TomasL
Som jag tolkar koden så jämför den värdet i HTTP_CLIENT_IP med värdet i REMOTE_ADDR de skall normalt sett vara lika, annars så är IP-adressen sannolikt spoofad.
dock är problemet att HTTP_CLIENT_IP inte existerar i serverns variabellista.
Frågan är om det är en server-konfigurations sak, eller var variabeln kommer ifrån.

Re: Nån duktig på PHP här

Postat: 3 juni 2024, 20:32:05
av TomasL
Hmm, verkar som att HTTP_CLIENT _IP sätts av en eventuell proxy.
Eller?

Re: Nån duktig på PHP här

Postat: 3 juni 2024, 21:14:51
av TomasL
Modifierade koden, och fick det att fungera:
Nya koden ser ut så här

Kod: Markera allt

public static function getIP() {
        if (!self::$ipaddress) {
        	 if (isset($_SERVER['HTTP_CLIENT_IP']))
                $ip = $_SERVER['HTTP_CLIENT_IP'];
           else if(isset($_SERVER['REMOTE_ADDR']))
                $ip = $_SERVER['REMOTE_ADDR'];
        	
          if (isset($_SERVER['HTTP_X_FORWARDED_FOR'])){
            $ips = explode(',', (string) filter_input(INPUT_SERVER, 'HTTP_X_FORWARDED_FOR'));
            if (count($ips)) {
                if ($ip) {
                    array_unshift($ips, $ip);
                    $ip = false;
                }
                foreach ($ips as $ip) {
                    if ($ip) {
                        break;
                    }
                }
            }
           } 
            self::$ipaddress = $ip ? $ip : filter_input(INPUT_SERVER, 'REMOTE_ADDR', FILTER_VALIDATE_IP);
            if (!self::$ipaddress) {
                die(' 403 Not Authorised, no or spammy IP address (' . self::$ipaddress . ')');
                exit;
            }
        }
        return self::$ipaddress;
    }
Den gamla såg ut så här:

Kod: Markera allt

 public static function getIP() {
        if (!self::$ipaddress) {
            $ip = filter_input(INPUT_SERVER, 'HTTP_CLIENT_IP', FILTER_VALIDATE_IP);
            $ips = explode(',', (string) filter_input(INPUT_SERVER, 'HTTP_X_FORWARDED_FOR'));
            if (count($ips)) {
                if ($ip) {
                    array_unshift($ips, $ip);
                    $ip = false;
                }
                foreach ($ips as $ip) {
                    if ($ip) {
                        break;
                    }
                }
            }
            self::$ipaddress = $ip ? $ip : filter_input(INPUT_SERVER, 'REMOTE_ADDR', FILTER_VALIDATE_IP);
            if (!self::$ipaddress) {
                die(' 403 Not Authorised, no or spammy IP address (' . self::$ipaddress . ')');
                exit;
            }
        }
        return self::$ipaddress;
    }

Re: Nån duktig på PHP här

Postat: 3 juli 2024, 16:00:49
av Henry788
Hej,

Jag har också stött på problem där HTTP_CLIENT_IP saknas i $_SERVER. I många fall beror det på att den här variabeln inte sätts av servern själv utan av en proxy eller en lastbalanserare framför servern. Du kan kontrollera om proxy eller lastbalanseraren är konfigurerad att skicka den här variabeln. Om inte, kan du försöka läsa REMOTE_ADDR direkt eller implementera en lösning där du hanterar båda fallen.

Hoppas det hjälper!