Заблокировать имена хостов и 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');
};
Другие вопросы по тегам