Kirjautuminen

Haku

Tehtävät

Keskustelu: Koodit: PHP IP-osoitteen esto käyttäen hyväksi .htaccessia

Magic Eye [08.04.2007 19:43:47]

#

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 &raquo;</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>";

				}

			}

		}


	}


?>

mauku [25.04.2007 17:38:18]

#

Mikä ihmeen <?= ???
Ei muuten toimi... Ootko testannu?
Jumittaa bannin lisäyksessä

Vastaus

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

Tietoa sivustosta