Tämä esimerkki osoittaa, miten voit luoda IP-bannausjärjestelmän, joka estää pääsyn KAIKKIIN tiedostoihin, jotka ovat palvelimellasi (edellyttäen, että tämä on lisätty kansioon public_html). Ärsyttävät spämmääjät ja mainostajat pysyvät loitolla, ja voit bannata useita ip-osoitteita kerralla, poistaa banneja, ja laittaa bannille syyn ja päivämäärän. Näin muistat, kenet bannasit ja miksi.
Toimivuuteen vaaditaan vain htaccess-tiedosto, joka on chmodattu oikeuksiin 0777. Lisäksi htaccess-tiedoston pitää olla samassa kansiossa kuin itse skripti, ellet sitten vaihda $t-muuttujaa skriptistä itse.
bannaaja.php
<?php /*/////////////////////////////////////////////////////////////////////////////////////////// /// Bannausjärjestelmä v2.0 - Tekijä Iiro Krankka /// ///////////////////////////////////////////////////////////////////////////////////////////// /// Kuvaus: IP-bannaaminen .htaccess-tiedostoa hyväksi käyttäen. /// /// Ominaisuudet: - Monen IP:n bannaaminen kerralla /// /// - Ei sotke muita htaccess-määrittelyjä, joten /// /// voidaan käyttää missä tahansa htaccess-tiedos- /// /// sa /// /// - Bannit voi poistaa todella helposti: yksi klik- /// /// kaus riittää! /// /// - Bannin syy ja päivämäärä voidaan merkata, /// /// joten muistat, minkä takia henkilön estit. /// /////////////////////////////////////////////////////////////////////////////////////////// /// Jos tulee kysyttävää, lähetä sähköpostia osoitteeseen /// /// iiro [piste] krankka [miukumauku] hotmail [piste] com /// /// tai kysy tämän koodivinkin kommenteissa. /// ///////////////////////////////////////////////////////////////////////////////////////*/ $t = ".htaccess"; // polku .htaccess-tiedostoon, joka estää kaikki ip-osoitteet $tamasivu = end ( explode ( "/", $_SERVER["PHP_SELF"] ) ); // helpotetaan nykyisen sivun tiedostonimen käyttöä $salas = "4936b3887d7d0dc0968851d8d9687977"; // salasana, jota käytetään kirjautumiseen. tämän pitää olla md5-kryptattu (nykyinen salasana on 54L454N4). if ( !file_exists ( $t ) ) { // jos .htaccess-tiedostoa ei ole... print "<p><strong>Virhe:</strong> htaccess-tiedostoa ei ole. Sinun täytyy luoda se manuaalisesti.</p>"; // ...näytetään virhe. } else { // jos .htaccess-tiedosto on olemassa... if ( $_COOKIE["bannaaja"] != $salas ) { // jos joku hakkeri on asettanut itse cookien, ei päästetä sisään ennenkuin tietää salasanan if ( !isset ( $_POST["login"] ) ) { // jos kirjautumislomaketta ei ole lähetetty, näytetään se. ?><form action="<?= $tamasivu; ?>" method="post"> <p> <label for="salasana">Salasana:</label><br /> <input type="password" name="salasana" id="salasana" /> <input type="hidden" name="login" id="login" value="t" /> </p> <p> <button type="submit">Lähetä</button> </p> </form><?php } else { // jos se onkin lähetetty... if ( $salas == md5 ( $_POST["salasana"] ) ) { // jos salasana meni oikein... setcookie ( "bannaaja", $salas ); // päästetään käyttäjä sisään... header ( "Location: $tamasivu" ); // ...ja ladataan sivu uudestaan. } else { // jos salasana meni väärin... print "<p><strong>Virhe:</strong> salasana on väärä!</p>"; // ...ilmoitetaan siitä vierailijalle. } } } else { // jos käyttäjä on jo kirjautunut sisään, näytetään hänelle valikko, ellei hän valinnut jotain toimintoa. if ( !isset ( $_GET["a"] ) && !isset ( $_POST["a"] ) ) { print "<a href=\"$tamasivu?a=naytaBeet\">Näytä kaikki bannit</a> <a href=\"$tamasivu?a=lisaaBee\">Lisää banneja</a>"; } else if ( $_GET["a"] == "naytaBeet" ) { // jos haluttu toiminto on "naytaBeet", näytetään kaikki bannit print "<table style=\"width:100%;\">\n\n\t<tr><td><strong>Bannattu IP</strong></td><td><strong>Bannauspvm</strong></td><td><strong>Bannauksen syy</strong></td><td><strong>Valinnat</strong></td></tr>\n"; // tulostetaan taulukon ylärivi näytölle. $tieD = file ( $t ); // .htaccess-tiedosto $banneja = false; // asetetaan boolean, jonka arvona on nyt vielä false. foreach ( $tieD as $rivi ) { // käydään .htaccess-tiedosto läpi... if ( strlen ( $rivi ) > 9 ) { // jos rivi ei ole tyhjä... if ( preg_match ( "/deny\s*from\s*([^\s]*)\s*#?\s*(.*)?\s*/i", $rivi, $osumat ) ) { // ...haetaan säännöllisillä lausekkeilla bannattu ip, aika ja syy bannaamiseen. $banneja = true; // asetetaan banneja-muuttujan arvoksi true. $tiedot = unserialize ( $osumat[2] ); // muutetaan serialize-funktion aiheuttama sekasotku takaisin taulukoksi. print "\t<tr><td>$osumat[1]</td><td>" . $tiedot["pvm"] . "</td><td>" . $tiedot["syy"] . "</td><td> <a href=\"$tamasivu?a=poistaB&B=$osumat[1]\">Poista banni</a></td></tr>\n"; // ja tulostetaan banni, päivämäärä ja syy bannaamiseen. } } } if ( !$banneja ) // jos ketään ei ole bannattuna... print "\t<tr><td>Ketään ei ole bannattu.</td></tr>"; // ...kerrotaan siitä. } else if ( $_GET["a"] == "lisaaBee" || $_POST["a"] == "lisaaBee" ) { // jos haluttu toiminto on lisääBee if ( !isset ( $_POST["askel"] ) ) { // jos lisäyslomaketta ei ole lähetetty, näytetään vaihe 1. ?><h2>Bannaa IP-osoite</h2> <form action="<?= $tamasivu; ?>" method="post"> <p> <label for="maara">Bannattavien IP-osoitteiden määrä:</label><br /> <input type="text" name="maara" id="maara" /> <input type="hidden" name="a" id="a" value="lisaaBee" /> <input type="hidden" name="askel" id="askel" value="1" /> </p> <p> <button type="submit">Jatka »</button> </p> </form><? } else if ( $_POST["askel"] == "1" ) { // jos lomake on lähetetty, näytetään vaihe 2. ?><h2>Bannaa IP-osoite</h2> <form action="<?= $tamasivu; ?>" method="post"> <?php for ( $i = 0; $i < $_POST["maara"]; $i++ ) { // tulostetaan haluttu määrä kenttiä. print "\n\t<p>\n\n\t\t<label for=\"ip-" . ($i+1) . "\">IP-osoite numero <strong>" . ($i+1) . "</strong>:</label><br />\n\t\t<input type=\"text\" name=\"ip-" . ($i+1) . "\" id=\"ip-" . ($i+1) . "\" value=\"IP-osoite\" /> <input type=\"text\" name=\"ip-" . ($i+1) . "-syy\" id=\"ip-" . ($i+1) . "-syy\" value=\"Bannin syy\" />\n\n\t</p>\n"; // tulostetaan kentät, joihin täytetään bannattava ip-osoite ja syy bannaamiselle. } ?> <p> <input type="hidden" name="maara" id="maara" value="<?= $_POST["maara"]; ?>" /> <input type="hidden" name="askel" id="askel" value="2" /> <input type="hidden" name="a" id="a" value="lisaaBee" /> <button type="submit">Bannaa</button> </p> </form><?php } else if ( $_POST["askel"] == "2" ) { // jos edellinen lomake on lähetetty... $kahva = @fopen ( $t, "a" ); // avataan .htaccess-tiedosto... $teksti = ""; for ( $i = 0; $i < $_POST["maara"]; $i++ ) { // ...lisätään teksti-muuttujaan... $tiedot = serialize ( array ( "pvm" => date ( "d.m.Y. H:i" ), "syy" => $_POST["ip-" . ($i+1) . "-syy"] ) ); $teksti .= "\ndeny from " . $_POST["ip-" . ($i+1)] . " #$tiedot"; // ...bannin tiedot. } if ( @fwrite ( $kahva, $teksti ) ) { // jos bannin lisäys onnistui... header ( "Location: $tamasivu?a=naytaBeet" ); // ladataan sivu, joka näyttää kaikki bannit. } else { // jos taas ei... print "<p>IP-osoitteiden bannaamisessa virhe. Tarkista, että tiedosto .htaccess on chmodattu oikeuksiin 0777.</p>"; // kerrotaan siitä käyttäjälle. } fclose ( $kahva ); // suljetaan .htaccess-tiedosto. } } else if ( $_GET["a"] == "poistaB" ) { // jos haluttu toiminto on poistaB... $teksti = ""; $tieD = file ( $t ); // ... foreach ( $tieD as $rivi ) { // käydään .htaccess tiedosto läpi rivi riviltä... preg_match ( "/deny\s*from\s*([^\s]*)\s*#?\s*(.*)?\s*/i", $rivi, $osumat ); // hajotetaan rivi palasiksi... if ( $osumat[1] != $_GET["B"] ) { // jos tämän rivin ip-osoite EI täsmää haluttuun... $teksti .= $rivi . "\n"; // lisätään kirjoitettavaan riviin rivin sisältö... } } $kahva = fopen ( $t, "w" ); // ...avataan .htaccess-tiedosto... if ( fwrite ( $kahva, preg_replace ( "/\n*$/i", "", $teksti ) ) ) { // ...yritetään kirjoittaa siihen sen alkuperäinen sisältö ilman ip-osoitetta, jonka esto haluttiin poistaa... header ( "Location: $tamasivu?a=naytaBeet" ); // ...jos onnistuu, näytetään kaikki bannit. } else { // ...jos ei onnistu, ilmoitetaan siitä käyttäjälle. print "<p>Bannin poisto epäonnistui. Tarkista, että tiedosto .htaccess on chmodattu oikeuksiin 0777.</p>"; } } } } ?>
Mikä ihmeen <?= ???
Ei muuten toimi... Ootko testannu?
Jumittaa bannin lisäyksessä
Aihe on jo aika vanha, joten et voi enää vastata siihen.