按国家/地区ip范围阻止用户注册

时间:2013-09-19 13:20:12

标签: php mysql

我在MYSQL中有以下表格

CREATE TABLE IF NOT EXISTS `countryip` (
`ip_from` bigint(10) unsigned NOT NULL DEFAULT '0',
`ip_to` bigint(10) unsigned NOT NULL DEFAULT '0',
`country_iso2` varchar(2) COLLATE utf8_bin NOT NULL DEFAULT '',
`country_iso3` varchar(3) COLLATE utf8_bin NOT NULL DEFAULT '',
`country_name` varchar(32) COLLATE utf8_bin NOT NULL,
KEY `ip_from` (`ip_from`,`ip_to`)) 
ENGINE=MyISAM DEFAULT CHARSET=utf8 COLLATE=utf8_bin;

在这里,我添加了世界上所有国家的整个IP范围。

我想在php中创建一个脚本,该脚本将用户ip与此数据库中的ip范围进行比较,之后回显消息。 从我不喜欢的东西开始,我需要宣布

<?php
    mysql_select_db("database_name")   or die(mysql_error());
$ip = $_SERVER['REMOTE_ADDR'];
    $query = mysql_query("SELECT `IP` FROM `ban_ip` WHERE `IP` = '$ip'"); // this works only if i have the single static ip in the dbs, but now i have the ip range
    if (mysql_num_rows($query) > 0)
    {
echo ' <!DOCTYPE html> <html> <head> <script type="text/javascript"> alert("You are not allowed to access this website"); window.location.replace("index.php"); </script> </head> <body> </body> </html>';
    }

我该怎么做而不是这个查询

$query = mysql_query("SELECT `column` FROM `table` WHERE `column` = '$ip'");

以便在用户IP和ip范围之间进行比较。

IP FROM列,TO IP列如下所示 16777216,16777471, 为了找出ip,有一个类似于ip = 256 + CLASS B * 256 + CLASS C * 256 * 256 + CLASS D * 256 * 256 * 256

的公式

4 个答案:

答案 0 :(得分:3)

您可以对指定的表使用以下SQL查询:

SELECT `country_iso2` FROM `countryip` WHERE `ip_from` <= inet_aton('$ip') AND ip_to >= inet_aton('$ip')

这将为您指定的IP地址选择两个字符的国家/地区ISO代码。从这里开始,只需将ISO代码与禁止的国家代码表中的条目进行比较即可。

答案 1 :(得分:1)

我知道这不是你问题的直接答案,但我最近使用了这个API;

http://ipinfodb.com/ip_location_api_json.php

使用JSON非常容易,也可以从服务器快速回复。它是免费的,试一试,可以节省数据库中的一些存储空间。

答案 2 :(得分:1)

不是问题的直接答案,但是根据我的经验,自己维护IP数据库有点麻烦。

我已经使用了MaxMind免费的GeoLite2数据库,因为它经常更新并提供非常精确的结果:

https://github.com/maxmind/GeoIP2-php

答案 3 :(得分:0)

如果您对performance感到担忧,我建议您使用PHP Extension API。使用PHP(C API)扩展,您每秒可以获得超过700万次查询。 MySQL没有针对这些类型的查询进行调整,并且通过SQL管理不断变化的IP地址更新可能会成为一个难点。 Maxmind发布您可以轻松下载的每月更新。

我将介绍如何编译扩展,以及如何使用PHP中的mmdb数据库通过iso-3316双字符代码限制国家/地区:

Intro to Maxmind GeoLite2 with Kohana PHP

Geolocate IP Address