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

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

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

控制访问

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 '

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;

}

动态配置页面

$inst = new Redis();

$inst->connect('127.0.0.1', 6379);

$ip = $inst->sMembers('ip_blacklist');

$li = '';

foreach($ip as $val) {

$li .= '

'.$val.' delete';

}

?>

ul,li {

list-style: none;

}

ul {

margin: 0;

padding: 0;

}

li {

padding: 5px;

padding-top:0;

}

add

$(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('

'+ip_text+' delete')

} else {

alert('failed');

}

}

})

})

})

配置页面接口

$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;

}

}

}

}

php redis ip查找,php+redis实现ip白名单并提供可配置ip页面相关推荐

  1. java ip 白名单_Java代码中对IP进行白名单验证

    public classipUtil {//IP的正则,这个正则不能验证第一组数字为0的情况//private static Pattern pattern = Pattern//.compile(& ...

  2. IP白名单(iptables + ipset :允许国内ip + 自定义ip 访问系统udp端口)

    ########################## ## IP白名单(iptables + ipset :允许国内ip + 自定义ip 访问系统udp端口) #################### ...

  3. nginx设置IP、文件目录、请求头白名单

    1.重点 2.测试环境 3.设置IP白名单 禁止多个ip 4.禁止访问某个目录 路径匹配符号 5.禁止访问某个目录的单个文件 6.请求头白名单 7.设置对应响应码的返回页面 1.重点 location ...

  4. nginx - ip 限制规则、黑名单、白名单

    一.配置 ip 限制时的注意事项 #注意事项: # 1. deny 一定要加一个ip,否则直接跳转到403,不往下执行了;如果403默认页是同一域名下,会造成死循环访问: # 2. allow的ip段 ...

  5. vb.net 判断是否为ip 正则_PHP实现IP白名单

    有些项目可能会用到一个IP地址的白名单黑名单之类的验证. 比如,只有IP地址在白名单中,才可以访问该系统. 那么此时,白名单的维护,一般是一个文件,里边是一些IP地址(每行一个IP),当然也有的可能是 ...

  6. IP白名单添加了当前IP,获取access_token时依然报出错误码40164的坑

    开发公众号网页时,想要调用微信API接口,令人无奈的是,想要调用各接口都需使用access_token,于是,获取access_token的征途开始了-- 1.开发者基本配置 (1) 公众平台官网登录 ...

  7. 如何将风险应用加入白名单_将微信服务器、API接口的IP列表加入宝塔防火墙IP白名单...

    WordPress 一直是一个最棒的 CMS 内容管理系统,也能够非常轻松的跟微信公众号等进行对接,那么为了防止防火墙将微信功能误拦,我们需要将微信服务器.API 接口 的 IP 列表加入白名单.由于 ...

  8. Oracle数据库IP访问限制(IP白名单黑名单)

    1.编辑sqlnet.ora 内容为: #允许访问的IP(白名单) TCP.INVITED_NODES=(127.0.0.1,192.168.56.109,ip2,ip3,..,..本地IP..)若使 ...

  9. IP暴露接口IP白名单设置

    暴露接口IP白名单设置 暴露接口IP白名单设置 CrazyL- 2018-01-03 14:36:15  4797  收藏 1 展开 String realIp = IPUtil.getIpAddr( ...

最新文章

  1. Spring boot注入配置为java静态属性
  2. python中http_Python中HTTP协议
  3. 高效使用Vector
  4. 安装gcc 4.8.2 for cxx 11
  5. 【蓝桥杯Java_C组·从零开始卷】第八节、综合测试
  6. jmeterhttp代理服务器_Jmeter使用HTTP代理服务器录制
  7. MOOC推荐及三门基础学科
  8. 快速切题 cf118A
  9. 工程力学考研 可以转计算机专业吗,跨专业考研我是工程力学的本科生,想要考飞行 – 手机爱问...
  10. 破解版果冻手机动画主题for WM5 WM6
  11. 计算机excel怎么添加实线边框,给excel表格添加边框线
  12. Google Android8.1镜像WIFI提示“已连接但无法访问互联网“的解决办法
  13. 8核、6核、4核、双核CPU是什么意思
  14. SQL2005导入数据至2000的问题
  15. win10系统 如何设置定时开关机?
  16. [图像]中值滤波(Matlab实现)
  17. 从信息泄露到权限后台
  18. C语言中强制数据类型转换
  19. 【Unity3D】Unity3D技术栈
  20. Python实现多个PDF合并,超好用,run它

热门文章

  1. [crypto]-31-crypto engion的学习和总结
  2. 爬虫的基本知识第一个请求requests模块的基本使用
  3. 11、流程控制语句详解,IF,CASE,LOOP,LEAVE, ITERATE,REPEAT,WHILE
  4. Python借助队列实现进程通信
  5. 2.2 进阶-禁忌雷炎
  6. mysql 主从同步 工具_mysql主从同步工具maatkit安装
  7. 眼图在通信系统中有什么意义_解读CRM系统在企业中有什么作用
  8. 一次关于 Mysql 索引优化的思考
  9. 听说用 Lombok 可以早点下班?
  10. 蓝桥杯第五届决赛真题大全解(java版本)