2

我想阻止某些主机名和 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 是否在该列表中。我怎样才能做到这一点并保持网站快速加载?

谢谢

4

2 回答 2

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

如果您需要有关 file() 标志的更多信息,可以阅读.

出于安全原因,您可以将“ips.txt”文件放在外部无法访问的文件夹中。

第二种方式,你有一个存储所有 ips 的 sql 表:

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
于 2012-09-15T14:27:01.937 回答
-1

实际上,我上周刚刚在我的一个网站中实现了这个功能。我有一个带有 IP 列的 MySQL 表和一个原因列,因此用户可以看到他们的 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');
};
于 2012-09-15T14:09:56.400 回答