Заблокировать имена хостов и IP-адреса с помощью php
Я хочу заблокировать некоторые имена хостов и ips от доступа к моему веб-сайту, я использую этот код для блокировки только одного имени хоста или ip:
<?php
$hostname = gethostbyaddr($_SERVER['REMOTE_ADDR']);
$ipz = $_SERVER['REMOTE_ADDR'];
if ($hostname === "blocked hostname" || $ipz == "blokced ip" ){
echo "redirect to some url";
}
else {
echo "show site content";
}
?>
Но у меня есть длинный список имен хостов и IP-адресов, которые нужно заблокировать, я хочу добавить все эти плохие IP-адреса и имена хостов, которые у меня есть, в отдельном файле, а затем проверить, есть ли в этом списке имя хоста или IP-адрес посетителя. как я могу это сделать и быстро загружать сайт?
Спасибо
2 ответа
Во-первых, поместите все свои ip в один файл, разделенный новой строкой. Затем вы будете делать:
$ips = file("ips.txt", FILE_SKIP_EMPTY_LINES | FILE_IGNORE_NEW_LINES);
if (in_array($hostname, $ips) || (in_array($ipz, $ips)) {
// redirect to some content for banned guyz
die();
}
// real things
Если вам нужна дополнительная информация о файлах (), вы можете прочитать это.
По соображениям безопасности вы можете поместить файл "ips.txt" в папку, недоступную извне.
Второй способ, у вас есть таблица sql, где хранятся все ips:
require_once("config.php");
$dbh = new PDO("mysql:host={$host};dbname={$base}", $user, $password);
$hostname = gethostbyaddr($_SERVER['REMOTE_ADDR']);
$ipz = $_SERVER['REMOTE_ADDR'];
$sth = $dbh->prepare("select count(*) from banned_ips where ip IN (?, ?)");
$sth->execute(array($hostname, $ipz));
$count = $sth->fetchColumn();
if ($count > 0) {
// do some stuffs with banned user
die();
}
// do some stuffs with normal users
Я на самом деле только что реализовал эту функцию на прошлой неделе на одном из моих сайтов. У меня есть MySQL Table со столбцом IP и столбцом причины, чтобы и пользователь мог видеть, почему его IP заблокирован, и тот, кто может редактировать / просматривать список.
$query = 'SELECT * FROM banned_ips';
$result = mysql_query($query);
while ($row = mysql_fetch_array($result)) {
$bannedips = array($row['ip']);
};
$ip=$_SERVER['REMOTE_ADDR'];
if (in_array($ip, $bannedips))
{
header('Location: some url');
};