php redis ip查找,php+redis实现ip白名单并提供可配置ip页面
ip白名單或者黑名單,目的是為了達到一種受限訪問,希望在名單內(nèi)用戶可以訪問,就把名單叫白名單;希望在名單內(nèi)用戶拒絕訪問,就是黑名單。無論我們希望使用哪種名單方式,實現(xiàn)方式都一樣。
在nginx下我們通常會考慮用nginx+lua的方式來實現(xiàn),它很優(yōu)雅速度快。確實,這是一種方案,我也做過這種方案的研究。但我覺的它不夠靈活,我選擇在應(yīng)用程序中來實現(xiàn)名單機制。
主要思路:用戶->獲取ip->redis取出名單庫->比對->處理
控制訪問
isAccess();
/**
* 檢測是否在白名單內(nèi),否則拒絕訪問
*
* @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;
}
動態(tài)配置頁面
$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;
}
}
}
}
《新程序員》:云原生和全面數(shù)字化實踐50位技術(shù)專家共同創(chuàng)作,文字、視頻、音頻交互閱讀總結(jié)
以上是生活随笔為你收集整理的php redis ip查找,php+redis实现ip白名单并提供可配置ip页面的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: java 手动编译打包_Maven 手动
- 下一篇: centos7 ldap php,php