Nån duktig på PHP här

C, C++, Pascal, Assembly, Raspberry, Java, Matlab, Python, BASIC, SQL, PHP, etc.
Användarvisningsbild
TomasL
EF Sponsor
Inlägg: 46950
Blev medlem: 23 september 2006, 23:54:55
Ort: Borås
Kontakt:

Nån duktig på PHP här

Inlägg 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
Användarvisningsbild
TomasL
EF Sponsor
Inlägg: 46950
Blev medlem: 23 september 2006, 23:54:55
Ort: Borås
Kontakt:

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

Inlägg av TomasL »

Har konstaterat att variabeln "REMOTE_ADDR" innehåller min lokala IP, så uppenbarligen är det något syntaxfel i ovanstående funktion.
Användarvisningsbild
rvl
Inlägg: 6936
Blev medlem: 5 april 2016, 14:58:53
Ort: Helsingfors

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

Inlägg 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å?
Användarvisningsbild
TomasL
EF Sponsor
Inlägg: 46950
Blev medlem: 23 september 2006, 23:54:55
Ort: Borås
Kontakt:

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

Inlägg 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
Användarvisningsbild
mrfrenzy
Co Admin
Inlägg: 15509
Blev medlem: 16 april 2006, 17:04:10

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

Inlägg 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.
Användarvisningsbild
TomasL
EF Sponsor
Inlägg: 46950
Blev medlem: 23 september 2006, 23:54:55
Ort: Borås
Kontakt:

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

Inlägg av TomasL »

Nä, jag uppdaterade Joomla mm.
PHP-versionen är inte ändrad
Användarvisningsbild
mrfrenzy
Co Admin
Inlägg: 15509
Blev medlem: 16 april 2006, 17:04:10

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

Inlägg 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.
Användarvisningsbild
TomasL
EF Sponsor
Inlägg: 46950
Blev medlem: 23 september 2006, 23:54:55
Ort: Borås
Kontakt:

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

Inlägg av TomasL »

Den är kompatibel.
problemet är att fältet HTTP_CLIENT_IP saknas i $_server
Användarvisningsbild
TomasL
EF Sponsor
Inlägg: 46950
Blev medlem: 23 september 2006, 23:54:55
Ort: Borås
Kontakt:

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

Inlägg 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.
Användarvisningsbild
TomasL
EF Sponsor
Inlägg: 46950
Blev medlem: 23 september 2006, 23:54:55
Ort: Borås
Kontakt:

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

Inlägg av TomasL »

Hmm, verkar som att HTTP_CLIENT _IP sätts av en eventuell proxy.
Eller?
Användarvisningsbild
TomasL
EF Sponsor
Inlägg: 46950
Blev medlem: 23 september 2006, 23:54:55
Ort: Borås
Kontakt:

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

Inlägg 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;
    }
Henry788
Inlägg: 19
Blev medlem: 30 juni 2024, 01:30:43

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

Inlägg 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!
Skriv svar