Gå til innhold

en liten snutt som sjekker IP adresse før videresending


Anbefalte innlegg

Hei!

 

Fra en joomla-installasjon jeg har (www.hkskole.no) har jeg en lenke til organisasjonens intranett. Denne fungerer naturlig nok kun fra maskiner i org. nett. Klikker man på lenken fra utsiden kommer naturlig nok en feilmelding.

 

Jeg skulle hatt en kodesnutt som sjekker om maskinen har en IP-adresse i nett 172.20.x.x. Hvis så er tilfelle gå videre til URL http://intranett

 

Hvis ikke IP-adressen er i denne rangen, vise en feilmelding som forteller at siden kun kan nås fra org. internnett.

 

Noen som ser en mulighet?

--

Pål Monstad

Lenke til kommentar
Videoannonse
Annonse

function compareIP($ip1, $ip2, $mask=32)
{
$ip1 = ip2long($ip1);
$ip2 = ip2long($ip2);

//If mask is 32, that is every bit should be compared, direct comparison
// will do just fine.
if ($mask === 32)
	return ($ip1 === $ip2);
elseif ($ip1 !== false && $ip2 !== false &&
		$mask < 32 && $mask > 0 && is_int($mask))
{
	//Tranlating mask from number of bits to int with first $mask
	// number bits set
	//0xFFFFFFFF = all 32bits set
	$mask = 0xFFFFFFFF-((1 << (32-$mask))-1);

	$ip1 &= $mask;
	$ip2 &= $mask;
	return ($ip1 === $ip2);
}
else
	return false;
}
var_dump(compareIp($_SERVER['REMOTE_ADDR'], '172.20.0.0', 16));

Egentlig ment for å sjekke om to IPer tilhører samme subnet, men den kan likegjerne brukes til dette også.

Endret av Ernie
Lenke til kommentar

Forstod ikke hvordan koden til Ernie fungerte til dette, så jeg skrev en kjapp en..

 

<?php

// Legger ip i variabel
$ip = $_SERVER['REMOTE_ADDR'];

// Deler opp ip til $ipex[0,1,2,3]
$ipex = explode(".", $ip);

// Sjekker om $ipex[0] er 172 og $ipex[1] er 20
if($ipex[0] == "172" && $ipex[1] == "20") { 
// Sender videre til:
header("Location: http://intranet/");
}
else { 
// Hvis ikke, vis feilmelding:
echo("Denne siden er kun for personer i intranettet");
}

?>

Endret av Goggen90
Lenke til kommentar

Vel, det er en litt vel binær måte å gjøre det på, så jeg er ikke akkurat sjokkert over at ikke alle tar den med en gang. Antar det er den delen som er problemet:

		$mask = 32 - (int)$mask;
	$mask = 0xFFFFFFFF-((1 << $mask)-1);

	$ip1 = $ip1 & $mask;
	$ip2 = $ip2 & $mask;
	return ($ip1 === $ip2);

Greia er at $mask inneholder antall bit fra venstre som skal være likt. Dette er avhengig av submask for nettverket. Normal har man 255.255.255.0 som i praksis bety at man har et /24-nettverk, altså at de 24 første bitene er satt mens de restende 8 varierer. For å kunne benytte det i en binær-operasjon kan jeg ikke ha antall bit, jeg må ha et tall, og det er det de to første linjene gjør. 0xFFFFFFFF-((1 << $mask)-1) er bare en ikke-triviell måte å ta 2^32-1 (dvs. all 32bit satt) og trekke fra $mask antall bit fra høyre (1 << n «dytter» 1 n antall ganger mot venstre, f.eks 1 << 4 gir 10000 binært og når man trekker fra 1 etterpå får man 1111). $mask inneholder nå de bitene som må være satt for at begge IPene skal tilhøre samme subnet. De tre restende linjene henter ut de bitene fra IPene og sjekker om de er like (underforstått om IPene faktisk tilhører samme subnet).

Lenke til kommentar
Forstod ikke hvordan koden til Ernie fungerte til dette, så jeg skrev en kjapp en..

 

<?php

// Legger ip i variabel
$ip = $_SERVER['REMOTE_ADDR'];

// Deler opp ip til $ipex[0,1,2,3]
$ipex = explode(".", $ip);

// Sjekker om $ipex[0] er 172 og $ipex[1] er 20
if($ipex[0] == "172" && $ipex[1] == "20") { 
// Sender videre til:
header("Location: http://intranet/");
}
else { 
// Hvis ikke, vis feilmelding:
echo("Denne siden er kun for personer i intranettet");
}

?>

 

 

 

 

Takk skal du ha! Dette gjorde susen!

Lenke til kommentar

Opprett en konto eller logg inn for å kommentere

Du må være et medlem for å kunne skrive en kommentar

Opprett konto

Det er enkelt å melde seg inn for å starte en ny konto!

Start en konto

Logg inn

Har du allerede en konto? Logg inn her.

Logg inn nå
  • Hvem er aktive   0 medlemmer

    • Ingen innloggede medlemmer aktive
×
×
  • Opprett ny...