资讯专栏INFORMATION COLUMN

php+redis实现ip白名单并提供可配置ip页面

Profeel / 645人阅读

摘要:白名单或者黑名单,目的是为了达到一种受限访问,希望在名单内用户可以访问,就把名单叫白名单希望在名单内用户拒绝访问,就是黑名单。但我觉的它不够灵活,我选择在应用程序中来实现名单机制。

ip白名单或者黑名单,目的是为了达到一种受限访问,希望在名单内用户可以访问,就把名单叫白名单;希望在名单内用户拒绝访问,就是黑名单。无论我们希望使用哪种名单方式,实现方式都一样。

在nginx下我们通常会考虑用nginx+lua的方式来实现,它很优雅速度快。确实,这是一种方案,我也做过这种方案的研究。但我觉的它不够灵活,我选择在应用程序中来实现名单机制。

主要思路:用户->获取ip->redis取出名单库->比对->处理

代码Github库:https://github.com/jacoobwang...

控制访问

connect("127.0.0.1", 6379);
            $ip_white_list = $inst->sMembers("ip_blacklist");
            if(!in_array($ip, $ip_white_list)) {
                echo "

HTTP/1.1 403 Forbidden

"; header("HTTP/1.1 403 Forbidden"); } } } /** * 获取用户的IP * * @return void */ function getRemoteIp(){ if(isset($_SERVER["HTTP_X_FORWARDED_FOR"])){ $ip = $_SERVER["HTTP_X_FORWARDED_FOR"]; }elseif(isset($_SERVER["HTTP_CLIENT_IP"])){ $ip = $_SERVER["HTTP_CLIENT_IP"]; }elseif(getenv("HTTP_X_FORWARDED_FOR")){ $ip = getenv("HTTP_X_FORWARED_FOR"); }elseif(getenv("HTTP_CLIENT_IP")){ $ip = getenv("HTTP_CLIENT_IP"); }elseif($_SERVER["REMOTE_ADDR"]){ $ip = $_SERVER["REMOTE_ADDR"]; } else{ $ip = null; } return $ip; }

动态配置页面

connect("127.0.0.1", 6379);
$ip = $inst->sMembers("ip_blacklist");
$li = "";
foreach($ip as $val) {
    $li .= "
  • ".$val." delete
  • "; } ?>

    配置页面接口

    connect("127.0.0.1", 6379);
    $type = isset($_POST["type"]) ? $_POST["type"] : ""; 
    $ip = isset($_POST["ip"]) ? $_POST["ip"] : "";
    if(!empty($ip)){
        $isExist = $inst->sIsMember("ip_blacklist",$ip);
        
        if($isExist) {
            if($type == "delete"){
                // delete
                $rs = $inst->sRemove("ip_blacklist",$ip);
                echo $rs;
            }
        } else {
            if($type == "add"){
                if(preg_match("/^d{2,3}.d{2,3}.d{2,3}.d{1,3}$/",$ip)) {
                    $rs = $inst->sAdd("ip_blacklist",$ip);
                    echo $rs;
                } else {
                    echo 2;
                }
            }
        }
    } 

    文章版权归作者所有,未经允许请勿转载,若此文章存在违规行为,您可以联系管理员删除。

    转载请注明本文地址:https://www.ucloud.cn/yun/22843.html

    相关文章

    • php+redis实现ip名单思路篇

      摘要:实现思路画了个简易流程图,方便大家理解。如果存在就继续向下流程,如果不存在则向右流程,返回,这样就拒绝了不在库中用户的访问,达到了白名单效果。实现代码参考结语如果有更多白名单问题或者白名单问题都可以留言与我联系 今天发的是一篇续篇,主要讲讲如何实现?想阅读第一篇的,点击传送门 首先完善了下管理配置后台,看下dashbord长什么样,先睹为快。 showImg(https://segme...

      techstay 评论0 收藏0
    • 面向对象的分布式爬虫框架XXL-CRAWLER

      摘要:面向对象的分布式爬虫框架一简介概述是一个面向对象的分布式爬虫框架。分布式集群集群方式维护爬虫爬虫运行数据,可通过或定制实现。 《面向对象的分布式爬虫框架XXL-CRAWLER》 showImg(https://segmentfault.com/img/remote/1460000011842697);showImg(https://segmentfault.com/img/remote...

      anquan 评论0 收藏0

    发表评论

    0条评论

    最新活动
    阅读需要支付1元查看
    <