使用php阻止主机名和IP

时间:2012-09-15 14:07:10

标签: php geolocation geotargetting

我想阻止一些主机名和ips访问我的网站,我使用这个codde =只阻止一个主机名或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 个答案:

答案 0 :(得分: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()标志的更多信息,可以阅读this

出于安全考虑,您可以将“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

答案 1 :(得分:-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');
};
相关问题