php+redis實現ip白名單並提供可配置ip頁面

ip白名單或者黑名單,目的是爲了達到一種受限訪問,但願在名單內用戶能夠訪問,就把名單叫白名單;但願在名單內用戶拒絕訪問,就是黑名單。不管咱們但願使用哪一種名單方式,實現方式都同樣。javascript

在nginx下咱們一般會考慮用nginx+lua的方式來實現,它很優雅速度快。確實,這是一種方案,我也作過這種方案的研究。但我覺的它不夠靈活,我選擇在應用程序中來實現名單機制。php

主要思路:用戶->獲取ip->redis取出名單庫->比對->處理css

代碼Github庫:https://github.com/jacoobwang...html

控制訪問java

<?php
    isAccess();
    /**
     * 檢測是否在白名單內,不然拒絕訪問
     * 
     * @return void
     */
    function isAccess(){
        $ip = getRemoteIp();
        if(!empty($ip)) {
            $inst = new Redis();
            $inst->connect('127.0.0.1', 6379);
            $ip_white_list = $inst->sMembers('ip_blacklist');
            if(!in_array($ip, $ip_white_list)) {
                echo '<h1 align=center>HTTP/1.1 403 Forbidden</h1>';
                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;
    }

動態配置頁面jquery

<?php
$inst = new Redis();
$inst->connect('127.0.0.1', 6379);
$ip = $inst->sMembers('ip_blacklist');
$li = '';
foreach($ip as $val) {
    $li .= '<li><span>'.$val.'</span>&nbsp;<a data="'.$val.'" class="js_del" href="javascript:void(0)">delete</a></li>';
}
?>

<html>
    <head>
        <style>
            ul,li {
                list-style: none;
            }
            ul {
                margin: 0;
                padding: 0;
            }
            li {
                padding: 5px;
                padding-top:0;
            }
        </style>
    </head>
    <body>
        <ul id="ipList">
            <?php echo $li;?>   
        </ul>  

        <input type="text" name="ip_text" />
        <button id="submit">add</button>        
    </body>
    <script src="https://cdn.bootcss.com/jquery/3.2.0/jquery.js"></script>
    <script>
        $(function(){
            // 刪除
            $('#ipList').on('click','.js_del',function(){
                var _this = this,
                    ip_text = $(this).attr('data'); 
                $.ajax({
                    url: 'http://localhost:6699/ip-white-php/ip.php',
                    method: 'POST',
                    data: 'type=delete&ip='+ip_text,
                    success: function(res){
                       if(res == 1){
                           alert('success');
                           $(_this).parent().remove();
                       } else {
                           alert('failed');
                       }     
                    }
                })
            })
            // 添加
            $('#submit').click(function(){
                var ip_text = $("input[type=text]").val(),
                    re = /^\d{2,3}.\d{2,3}.\d{2,3}.\d{1,3}$/;
                if (!re.test(ip_text)) {
                    alert('您輸入的IP格式不對');
                    return;
                }   
                $.ajax({
                    url: 'http://localhost:6699/ip-white-php/ip.php',
                    method: 'POST',
                    data: 'type=add&ip='+ip_text,
                    success: function(res){
                       if(res == 1){
                           alert('success');
                           $('#ipList').append('<li><span>'+ip_text+'</span>&nbsp;<a data="'+ip_text+'" class="js_del" href="javascript:void(0)">delete</a></li>')
                       } else {
                           alert('failed');
                       }
                    }
                })
            })
        })
    </script>
</html>

配置頁面接口nginx

<?php
$inst = new Redis();
$inst->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;
            }
        }
    }
}
相關文章
相關標籤/搜索