通过IP获取地址,限制某些地址访问(GeoIp)

一、前言

      一说通过IP获取地址,大家肯定都很熟悉了,是咱们经常做的功能之一。网上一查各种免费的IP库也是一大堆,不过这些免费库或多或少都会存在一起问题,为了更适用于项目场景,博主这里选择GeoIp的免费库。

二、其他免费库

大家参考地址:https://www.cnblogs.com/wangluochong/p/4528401.html

      这个博主里面把大概的免费库,比如淘宝IP,新浪,网易等都说了一遍,博主这里就不一一赘述了,有需要的朋友可以直接去用的,博主这里说一下需要注意的地方。

注意:

			1、有访问频率限制,不知道现在有没有,之前是限制10qps(例如淘宝IP)
			2、不支持Https(例如淘宝IP)
			3、访问可能会超时,需要设置超时时间,毕竟官网有时候都刷不出来(例如淘宝IP)
			4、可能会有跨域问题,对前端使用不友好(例如淘宝IP)

三、GeoIp库

      关于这个库,大家应该也都听说过,这个库名也是php的一个扩展之一。正版的使用是需要花钱的,不过官方还维护的有一个免费的版本,准确度还行,各方面特性也不错,博主这边就是使用的这个免费的库。这里主要介绍两种方法,分别对应的是.dat文件和.mmdb文件。

1、下载对应的mmdb文件,使用github上的库来读取

(1)mmdb文件下载地址:

http://geolite.maxmind.com/download/geoip/database/GeoLite2-Country.mmdb.gz

      通过这个地址下载的是官方维护的mmdb文件库,我们需要做的就是读取这个文件,然后通过Ip获取对应的地址。但是这个mmdb文件并不是那么容易读取的,它是一个二进制的文件,我们这里使用github上的一个库来读取它。

(2)github库下载地址

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

      这里需要注意的是,这个库一定要用composer方式来安装,其次是要开启curl扩展,读取的代码类似与下:

这里只是一个简单的php文件,如果是在框架中引用的话会更方便
<?php
require_once 'vendor/autoload.php';    //引入自动加载函数
use GeoIp2\Database\Reader;   //引入读取的类
$reader = new Reader('./geoip.mmdb');    //引入mmdb文件
// todo  本地必须开启curl扩展,支持php5.3以上
    $ip = getIp();   //  getIp()是博主获取ip地址的方法,这个大家自己写就行
    if($ip == "0.0.0.0"){
        $data = array(
            'status' => "ERR",
            'country' => "IP地址不合法",
            'IP'=>$ip
        );
    }else {
        //$record = $reader->country("140.82.113.3");
        $record = $reader->country($ip);
        $country = $record->country->isoCode;
        if ($record) {
            $data = array(
                'status' => "SUCCESS",
                'country' => $country,
                'IP' => $ip

            );
        } else {
            $data = array(
                'status' => "ERR",
                'country' => "获取地址失败",
                'IP' => $ip
            );
        }
    }
$json = json_encode($data,JSON_UNESCAPED_UNICODE);
echo $json;  // 输出的就是地址了

2、使用geoip的扩展来读取

(1)安装扩展

      dll文件的下载地址:
https://pecl.php.net/package/geoip/1.1.1/windows
      找到dll文件一定要下载对应版本的dll文件,可以通过php.ini查看自己的版本信息。把dll文件复制到ext文件夹,重启php,在php.ini找到这个新扩展即可。

(2)安装好扩展,怎么使用呢

      安装好扩展之后,博主也是一脸懵逼,这怎么用呢,也没有什么引入文件之类的。后面找到了php对应的一些geoip的函数,咱们直接使用看看:

 $ip ='140.82.113.3';  //140.82.113.3  github.com 
   $record = geoip_country_code_by_name($ip);  //获取缩写CN
(3)根据报错信息调试

报错:

geoip_country_name_by_name(): Required database not available at C:/xampp/apache/bin/GeoIP.dat

调试: 根据报错信息,找到对应的路径,然后下载GeoIp.dat文件

下载路径
https://mirrorscdn.liferay.com/geolite.maxmind.com/download/geoip/database/GeoIP.dat.gz
提示: 这里下载的是.dat文件,不过貌似官方已经不准备维护它了,所以这个库的话,可能会越来越不精准,需要注意下。

(4)最终使用示例
<?php

try {
    $ip =getIp();  //140.82.113.3  github.com
    $record = geoip_country_code_by_name($ip);  //获取缩写CN
    //$record = geoip_country_name_by_name("www.baidu.com");  //获取China
    $data = array(               // [] 的写法是php5.4之后才有的
        'status' => "SUCCESS",
        'country' => $record
    );
}catch(Exception $err){
    $data = array(
        'status' => "ERR",
        'country' => $err->getMessage()
    );
}
$json = json_encode($data);
echo $json;

总结:

      整体来说,GeoIp的免费库用起来是比国内大厂维护的IP库要复杂一些的,如果你需要在前端获取IP进行限制的话,那么最好是选用新浪或者网易的IP库。如果是大型企业级应用的话,可以考虑使用免费的GeoIp的库或者花钱使用官方库都可以的,使用的时候,建议是用composer安装工具来解析mmdb文件。

end

要在ThinkPHP项目中使用GeoIP2来实现限制请求IP只能巴西访问,你可以按照以下步骤进行配置: 1. 安装GeoIP2依赖包:在命令行中,进入你的ThinkPHP项目目录,然后运行以下命令来安装GeoIP2依赖包: ```shell composer require geoip2/geoip2:~2.0 ``` 2. 下载GeoIP2数据库:访问MaxMind网站(https://dev.maxmind.com/geoip/geoip2/geolite2/),下载GeoIP2数据库文件(通常是以.mmdb扩展名结尾的文件)。 3. 将GeoIP2数据库文件放置在项目的合适位置,例如`public`文件夹下的`geoip`文件夹。 4. 在ThinkPHP项目中创建一个新的中间件(Middleware),用于检查请求IP是否为巴西的IP。在命令行中,进入你的ThinkPHP项目目录,然后运行以下命令来创建中间件: ```shell php think make:middleware BrazilIPCheck ``` 5. 编辑刚创建的中间件文件:在`app/middleware`目录下找到并打开`BrazilIPCheck.php`文件。 6. 在`handle`方法中,添加以下代码来检查请求IP是否为巴西的IP: ```php use GeoIp2\Database\Reader; public function handle($request, \Closure $next) { $ip = $request->ip(); // 加载GeoIP2数据库 $databasePath = public_path('geoip/GeoLite2-Country.mmdb'); $reader = new Reader($databasePath); try { // 获取请求IP的国家信息 $record = $reader->country($ip); $countryCode = $record->country->isoCode; // 如果不是巴西的IP,则返回403 Forbidden 错误 if ($countryCode !== 'BR') { return response('403 Forbidden', 403); } } catch (\Exception $e) { // 处理数据库加载或查询错误 return response('500 Internal Server Error', 500); } return $next($request); } ``` 7. 保存并关闭`BrazilIPCheck.php`文件。 8. 在`app/middleware`目录下的`middleware.php`文件中,注册刚创建的中间件: ```php return [ // ... \app\middleware\BrazilIPCheck::class, // ... ]; ``` 9. 现在,所有请求将通过中间件进行处理,如果请求IP不是巴西的IP,将返回403 Forbidden 错误。 请注意,以上步骤仅适用于限制请求IP只能巴西访问。如果需要更复杂的访问控制和安全性,建议结合其他认证和授权机制来实现。
评论 5
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

铁柱同学

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值