Kirjautuminen

Haku

Tehtävät

Keskustelu: Nettisivujen teko: IP bannaus

Sivun loppuun

ukat [30.12.2003 22:55:17]

#

Oon tallane PHP noob nii tartten bannauksessa apua.

Miten mun pitäis muuttaa tota seuraavaa koodii niin että bannattu menee jonnekkin sivulle?

Koodi:

<?php
$banned_ip = array();
$banned_ip[] = '111.111.111.111';
$banned_ip[] = '111.111.111.112';
$banned_ip[] = '111.111.111.113';
$banned_ip[] = '111.111.111.114';

foreach($banned_ip as $banned) {
	$ip = $_SERVER['REMOTE_ADDR'];
	if($ip == $banned){
		echo "Olet bannattu sivuilta!";
		exit();
	}
}
?>

tsuriga [30.12.2003 23:04:02]

#

header("Location: url"); tuo iffin sisään ennen mitään tulostuksia.
Silloin ei voi tulostaa tuota tekstiä echon jälkeen, mutta tämän voi kiertää esim. maagisella ob_start() ja ob_end_flush()funktioilla (kts. php.net) tai sitten käyttämällä meta-tagia.
Eli jos vaikka oot määritelly että $banned olisi totuusarvo sille onko bannattu ip löydetty niin:

<head><meta http-equiv="refresh" Content="aikatähän; URL=<php if ($banned) {
  echo "bannatunurli";
  }
else {
  echo "eibannatunurli";
  }
?>
"></head>

Déjà vu.

Antti Laaksonen [31.12.2003 01:15:11]

#

IP:n bannaaminen on minusta hieman kyseenalaista, koska monella IP muuttuu joka yhteydenottokerralla ja toisilla taas voi näennäisesti olla sama IP. Mutta tsurigan ohjeilla varmaan selviät, jos näin kuitenkin päätät tehdä.

tsuriga [31.12.2003 02:09:32]

#

Jepp. Ja tuossa on vielä muokattavaa esim. "?"-merkki ennen ensimmäistä php-sanaa.

NiKC [31.12.2003 08:10:37]

#

Ja jos kerran PHP:ta voidaan käyttää olisi suositeltavaa käyttää header() -funktiota edelleenohjaukseen.

header("Location: " . $urli);

Teme [31.12.2003 09:08:09]

#

Laita tiedostoon sekä IP että hosti. Tällöin on monta kertaa todennäköisempää, että se sama käyttäjä ei pääse sivuillesi. Tässä koodia, joka lukee ne tiedostosta:

<?php
$tiedosto = "bannit.txt";
$ip = $_SERVER['REMOTE_ADDR'];
$hosti = gethostbyaddr($ip);

if (!file_exists($tiedosto)) { die("Tarvittavaa tiedostoa bannit.txt ei löytynyt samasta hakemistosta palvelimelta."); }

$bann = file($tiedosto);

for ($i = 0; $i < count($bann); $i++)
{
     $temp = explode("|", trim($bann[$i]));

     if ($temp[0] == $ip or $temp[1] == $hosti)
     {
          echo("Hostinne / IP-osoitteenne on tällä sivustolla mustallalistalla.
                Mikäli bannaus on mielestänne aiheeton, ottakaa yhteyttä sivuston ylläpitoon sähköpostilla,
                josta tulee myös selvitä hostinne / IP:nne.\n");
          echo("<br><br>\nHosti: " . $hosti . "<br>\nIP: " . $ip);
     die();
     }
}
?>

Ookei, eli toi näyttää ton ilmoituksen + oman hostin ja IP:n, jos käyttäjä on bannattu. Ja seuraavaksi esimerkki, mitä tulee sijoittaa tiedostoon bannit.txt:

111.111.111.111|ua123d456.elisa.omakaista.fi
222.222.222.222|fc98-d7.inet.fi
255.255.255.255|12-34.adsl.lpoy.dnainternet.fi

Taisit ymmärtää, helposti? Eli ensin käyttäjän IP-osoite, sitten erotinmerkki ( | ) ja tämän jälkeen hosti. Ei mitään välilyöntejä erotinmerkin ympärille vaan kokonaan putkeen.

Edit: Unohdin mainita, että kaikki tässä oleva koodi on päästä heitettyä, testaamatonta sellaista.

trinit [31.12.2003 16:37:54]

#

lainaus:

ämän voi kiertää esim. maagisella ob_start() ja ob_end_flush()funktioilla (kts. php.net

Ei tarvitse mennä edes php.net:iin kun löytyy koodivinkkikin Output Buffering:sta:

https://www.ohjelmointiputka.net/koodivinkit/23853-php-output-buffering

larryweb [02.01.2004 21:14:46]

#

Miten tuohon olisi vielä mahdollisuus liittää syy mukaan miksi on bannattu.

esim. ip|hosti|syy

Meneekö näin:
$syy = explode("|","|", $syy); (eivarmaankaa :( )

tsuriga [02.01.2004 21:36:38]

#

Kannattaa tutkia oppaista explode-funktiota.
Se menis suunnilleen näin:

<?php
$ip = $_SERVER['REMOTE_ADDR'];
$hosti = gethostbyaddr($ip);
$filu=@file("bannatut.txt");
$syy;
$bannattu=false;
for ($i=0;$i<count($filu);$i++) {
  $banni=explode("|",$filu[$i]);
  if ($ip==$banni[0] && $hosti==$banni[1]) {
    $bannattu=true;
    $syy=$banni[2];
    }
  }
?>

TETRIS [04.01.2004 17:28:16]

#

tossa olis vielä yks koodi :

<?php
# Sivu jonne ohjataan jos bannattu
$banni_url  = "bannattu.php";

# Tiedosto joka sisältää bannatut IP:t
$banned = file("bannatut.dat");

if(array_search($_SERVER["REMOTE_ADDR"],$banned) !== false) {
# Ohjataan bannattu sivulle
      header ("Location: ". $banni_url);
        exit;
}
?>

IP:t pitää olla sitten allekkain eri rivillä jokainen..... ainiin ja iahn koodin alkuu pitää pistää ob_start() ja loppuun ob_end_flush() niin sitten pelittää

k-mikko [04.01.2004 18:02:55]

#

lainaus:

koodin alkuu pitää pistää ob_start() ja loppuun ob_end_flush() niin sitten pelittää

Eikä pidä. Se riittää, että tuon pätkän laittaa aivan skriptin alkuun.

TETRIS [07.01.2004 15:56:49]

#

Eipä vaan mulla. Ainakaan kun pistän includella ihan alkuun ton bannauksen. Tosin ei toimi varmaankaan siks ku käytän sellasta ?sivu=etusivu scriptiä.


Sivun alkuun

Vastaus

Aihe on jo aika vanha, joten et voi enää vastata siihen.

Tietoa sivustosta