C, C++, Pascal, Assembly, Raspberry, Java, Matlab, Python, BASIC, SQL, PHP, etc.
TomasL
EF Sponsor
Inlägg: 46950 Blev medlem: 23 september 2006, 23:54:55
Ort: Borås
Kontakt:
Inlägg
av TomasL » 3 juni 2024, 19:27:25
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
TomasL
EF Sponsor
Inlägg: 46950 Blev medlem: 23 september 2006, 23:54:55
Ort: Borås
Kontakt:
Inlägg
av TomasL » 3 juni 2024, 19:45:59
Har konstaterat att variabeln "REMOTE_ADDR" innehåller min lokala IP, så uppenbarligen är det något syntaxfel i ovanstående funktion.
rvl
Inlägg: 6936 Blev medlem: 5 april 2016, 14:58:53
Ort: Helsingfors
Inlägg
av rvl » 3 juni 2024, 19:56:22
Ungefär noll erfarenhet av just PHP, men det sticker ut att just REMOTE_ADDR är omgiven av "fnuttar", ska det verkligen vara så?
TomasL
EF Sponsor
Inlägg: 46950 Blev medlem: 23 september 2006, 23:54:55
Ort: Borås
Kontakt:
Inlägg
av TomasL » 3 juni 2024, 19:58:46
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
mrfrenzy
Co Admin
Inlägg: 15509 Blev medlem: 16 april 2006, 17:04:10
Inlägg
av mrfrenzy » 3 juni 2024, 20:11:50
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.
TomasL
EF Sponsor
Inlägg: 46950 Blev medlem: 23 september 2006, 23:54:55
Ort: Borås
Kontakt:
Inlägg
av TomasL » 3 juni 2024, 20:15:12
Nä, jag uppdaterade Joomla mm.
PHP-versionen är inte ändrad
mrfrenzy
Co Admin
Inlägg: 15509 Blev medlem: 16 april 2006, 17:04:10
Inlägg
av mrfrenzy » 3 juni 2024, 20:19:27
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.
TomasL
EF Sponsor
Inlägg: 46950 Blev medlem: 23 september 2006, 23:54:55
Ort: Borås
Kontakt:
Inlägg
av TomasL » 3 juni 2024, 20:21:56
Den är kompatibel.
problemet är att fältet HTTP_CLIENT_IP saknas i $_server
TomasL
EF Sponsor
Inlägg: 46950 Blev medlem: 23 september 2006, 23:54:55
Ort: Borås
Kontakt:
Inlägg
av TomasL » 3 juni 2024, 20:29:33
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.
TomasL
EF Sponsor
Inlägg: 46950 Blev medlem: 23 september 2006, 23:54:55
Ort: Borås
Kontakt:
Inlägg
av TomasL » 3 juni 2024, 20:32:05
Hmm, verkar som att HTTP_CLIENT _IP sätts av en eventuell proxy.
Eller?
TomasL
EF Sponsor
Inlägg: 46950 Blev medlem: 23 september 2006, 23:54:55
Ort: Borås
Kontakt:
Inlägg
av TomasL » 3 juni 2024, 21:14:51
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
Inlägg
av Henry788 » 3 juli 2024, 16:00:49
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!