Gå til innhold

Legge en hel ip-range i en array


Anbefalte innlegg

På hjemmesiden min har jeg både gjestebok og mulighet for å sende meg webbasert mail. Da jeg har blitt litt plaget med dumping av reklame i gjesteboken min og spam sendt fra gjesteboken min har jeg tatt ibruk diverse sikkerhetstiltak for å begrense dette. Jeg har derfor begynt å logge ip-adressen til de som sender meg mail fra hjemmesiden min og legger igjen melding i gjesteboken min. Det er de smame ip-adressene/subnettene som går igjen begge steder.

 

dette innebærer blandt annet at jeg har laget et script som sjekker ip-adressen til de som besøker hjemmesiden min opp mot den listen jeg har laget med ip-adresser (det er snakk om cirka 5 adresser så langt). De som har en ip-adresse som ligger i listen får en feilmelding og avvist.

 

de bannlyste ip-adressene ligger i en array og det jeg er interisert i nå er å prøve å få gjort slik at hele ip-ranges kan legges inn i arrayen (eller koden på andre måter. Noen som vet om det går ann?

 

her er koden (jeg har her anonymisert ip-adressene, men bytt gjerne ut med reelle ip-adresser for testing):

 

<?php 
//Dette stopper adresser som har sendt spam
$ip_adresse = getIP();
$banned_ip = array('en.ip','en.ip.til','tredje.ip');
foreach ($banned_ip as $ip) {
    if($ip == $ip_adresse) die("Her er feilmelding til de som sperres");
}

//Denne funksjonen sjekker ip-adressen til de som besøker siden
function getIP() {
    $ip;
    if (getenv("$HTTP_CLIENT_IP")) $ip = getenv("HTTP_CLIENT_IP");
    else if (getenv("HTTP_X_FORWARDED_FOR")) $ip =
getenv("HTTP_X_FORWARDED_FOR");
    else if (getenv("REMOTE_ADDR")) $ip = getenv("REMOTE_ADDR");
    else $ip = "UNKNOWN";
return $ip;
}
?>

Endret av ilpostino
Lenke til kommentar
Videoannonse
Annonse

Hvorfor legge hele "ip-rangen" i en array ?

 

 

$ip_adresse = getIP();
$block = array ( "192.168.2.1", "192.168.2.77", "127.");

foreach( $block as $ip_block){
  if( $ip_block == $ip_adresse OR (substr($ip_block, -1) == "." AND substr($ip_adresse,0, strlen($ip_block)) == $ip_block))
     echo "Du kan ikke sende, blæ blæ blæ";
  else
    echo "melding sendt";
  }

 

 

 

Bare en tanke.. ikke ut testet

 

EDIT: fikset en feil i koden

Endret av trondes
Lenke til kommentar
Hvorfor legge hele "ip-rangen" i en array ?

 

noen av de som dumper ting til gjesteboken min sitter på samme ip-range (feks 192.168.0.1 og 192.168.0.3). Hvis jeg sperrer for 192.168.0 (i dette tilfelle) så vil jeg lettere kunne sperre flere av ip-adressene ute...

Lenke til kommentar
noen av de som dumper ting til gjesteboken min sitter på samme ip-range (feks 192.168.0.1 og 192.168.0.3). Hvis jeg sperrer for 192.168.0 (i dette tilfelle) så vil jeg lettere kunne sperre flere av ip-adressene ute...

6042857[/snapback]

 

Det er greit, men dette hadde vært kjeddlig å legge inn

 

$block = array( "192.168.0.1","192.168.0.2","192.168.0.3","192.168.0.4","192.168.0.5","192.168.0.6" osv.);

 

derfor foreslår jeg min måte i stede ;)

Lenke til kommentar
Det er greit, men dette hadde vært kjeddlig å legge inn

 

$block = array( "192.168.0.1","192.168.0.2","192.168.0.3","192.168.0.4","192.168.0.5","192.168.0.6" osv.);

 

derfor foreslår jeg min måte i stede ;)

6042879[/snapback]

 

det hadde vært veldig kjedelig å legge inn og det er derfor jeg er på utkikk etter en lettere måte å legge in ip-range på...

 

;)

Lenke til kommentar

tror jeg har funnet ut en løsning. Ved å bruke eregi kan jeg bruke deler av en ip-adresse i søket etter bannede adresser. ny og bedre kode blir da slik:

 

<?php 
//Dette stopper adresser som har sendt spam
$ip_adresse = getIP();
$banned_ip = array('127.0.0.');

foreach ($banned_ip as $ip) {
 if (eregi($ip, $ip_adresse)) die ("dette er en test");  
}

//Denne funksjonen sjekker ip-adressen til de som besøker siden
function getIP() {
$ip;
if (getenv("$HTTP_CLIENT_IP")) $ip = getenv("HTTP_CLIENT_IP");
 else if(getenv("HTTP_X_FORWARDED_FOR")) $ip = getenv("HTTP_X_FORWARDED_FOR");
 else if(getenv("REMOTE_ADDR")) $ip = getenv("REMOTE_ADDR");
 else $ip = "UNKNOWN";
return $ip;
}
?>

 

dette gjør det hele bedre synes jeg, men er det noen andre (og bedre) alternativer?

Lenke til kommentar

kan man ikke bare bruke strpos a?

if(strpos($remote_addr, '197.138.123') === 0) BAN!
(dette vil banne alle med 197.138.123.*)

(merk tre likhetstegn for å sjekke at posisjonen er int(0) og ikke bool(0))

 

Det denne koden gjør er å sjekke om $remote_addr starter med 197.138.123, kort og greit.

Endret av Nazgul
Lenke til kommentar
Og ikke bruk foreach, men heller in_array ;)

6043061[/snapback]

 

den går bare på hele ip-adresser og fungerer ikke like bra som eregi på hele range av ip... jeg fikk den iallefall ikke til å fungere slik den ble beskrevet i php.net...

Endret av ilpostino
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...