pmonstad Skrevet 11. august 2009 Del Skrevet 11. august 2009 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
OIS Skrevet 12. august 2009 Del Skrevet 12. august 2009 Det er bedre å sørge for at intranett serveren har IP sjekk (i tillegg til login) og at linken ikke vises i det hele tatt hvis de ikke har riktig IP. Lenke til kommentar
Ernie Skrevet 12. august 2009 Del Skrevet 12. august 2009 (endret) 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 13. august 2009 av Ernie Lenke til kommentar
nree Skrevet 12. august 2009 Del Skrevet 12. august 2009 (endret) 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 12. august 2009 av Goggen90 Lenke til kommentar
Ernie Skrevet 13. august 2009 Del Skrevet 13. august 2009 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
pmonstad Skrevet 16. august 2009 Forfatter Del Skrevet 16. august 2009 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
Anbefalte innlegg
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 kontoLogg inn
Har du allerede en konto? Logg inn her.
Logg inn nå