最新消息:欢迎访问小松个人博客,小松最近开始学习java,感觉spring boot比较简单,下载文档开始学习一下

阿里云违规URL屏蔽访问处理通知解决方法

其他分享 92浏览 0评论

今天收到阿里云《违规URL屏蔽访问处理通知》的邮件,大概的意思是网站内容违规了,链接被阿里云屏蔽了,之前也出现过这个情况,主要是翻墙的内容都违规。

下面是我的处理策略

阿里云一定是扫描了我的网站才能检查出违规内容,那么就把阿里云扫描的IP屏蔽,通过访问日志,分析出阿里云的ip,然后屏蔽这个ip

环境

openresty+redis+php-fpm

具体实施

1)写一个php的定时脚本,每分钟执行一次,读取当天的日志文件【推荐阅读:nginx 日志分割】,把访问小松博客文章详情页的ip,找出来,如果agent是google,baidu等搜索引擎就过滤,通过网上的api查找ip是否是阿里云供应商,如果是阿里云ISP就写进redis
2)通过lua读取,redis中ip如果包含了当前访问的ip,就返回403
PS.目前我写的规则中屏蔽了神马搜索引擎,这里阿里的产品,不清楚是不是这个搜索引擎采集的

代码

php脚本代码

<?php
/**
 * 禁止阿里云的服务器ip访问网站
 * 定时脚本,每1分钟跑一次
 * 主要解决阿里云会扫描网站,然后判断是否有违反信息,VPN信息的内容被阿里云屏蔽
 */

set_time_limit(0);



//设置日志文件路径
$access_log_folde='/home/wwwlogs/';
$access_log_file='www.phpsong.com-'.date("Y-m-d").'-access.log';
#$access_log_file='www.phpsong.com-2017-10-17-access.log';

//抓取日志文件
$access_log_path=$access_log_folde.$access_log_file;
$access_log_content=file_get_contents($access_log_path);
$access_log_content=trim($access_log_content);

$row=explode("\n", $access_log_content);
$ip_array=array();
$now_day=date("YmdHis");

for($i=0;$i<count($row);$i++){
    $spider=true;

    $pattern='/\[(.*)\]/';
    preg_match_all ( $pattern , $row[$i] , $matches );    
    $temp=isset($matches[1][0])?$matches[1][0]:false;
    $log_day=date("YmdHis",strtotime($temp));
    //2分钟内的日志信息
    if($now_day-$log_day>200){
        $spider=false;
        continue;
    }
    $pattern='"GET \/(.*)\.html HTTP\/1.1"';
    preg_match_all ( $pattern , $row[$i] , $matches );
    $temp=isset($matches[1][0])?$matches[1][0]:false;
    if(!is_numeric($temp)){
        $spider=false;
        continue;
    }
    if(preg_match("/baidu.com/", $row[$i])){
        $spider=false;
        continue;
    }

    if(preg_match("/google.com/", $row[$i])){
        $spider=false;
        continue;
    }

    if(preg_match("/sogou.com/", $row[$i])){
        $spider=false;
        continue;
    }

    if(preg_match("/bing.com/", $row[$i])){
        $spider=false;
        continue;
    }
    if(preg_match("/yahoo.com/", $row[$i])){
        $spider=false;
        continue;
    }
    if(preg_match("/sm.cn/", $row[$i])){
        $spider=false;
        continue;
    }
    if(preg_match("/phpsong.com/", $row[$i])){
        $spider=false;
        continue;
    }

    if(preg_match("/YisouSpider/", $row[$i])){
        $spider=false;
        continue;
    }

    $col=explode(" ", $row[$i]);        
    $ip_array[$col[0]]=1;
    
}

$start_time=time();
echo 'count:'.count($ip_array);
if(count($ip_array)){
    foreach ($ip_array as $key => $value) {
        echo $key."\n";
        $aliyun=IP_to_aliyun($key);
        usleep(300);
        if($aliyun){
            write_to_redis($key);
        }

    }
}
$end_time=time();
echo 'time:'.($end_time-$start_time)."\n";
function IP_to_aliyun($ip){
    /*$url='http://ip.taobao.com/service/getIpInfo.php?ip='.$ip;
    $json=file_get_contents($url);
    $arr=json_decode($json,true);
    if($arr['code']=='1'){
        return false;
    }
    if($arr['data']['isp_id']=="100098"){
        return true;
    }*/
    $url='http://freeapi.ipip.net/'.$ip;

    $content=getHttpRequest($url);
    
    
    if(preg_match("/阿里云/",$content)){
        return true;
    }
    return false;
}

function write_to_redis($ip){
    //redis 连接
    $redis = new Redis();
    if ($redis->connect('127.0.0.1','6379') == false) {
        die($redis->getLastError());
    }
    $redis_key='disallowIP';
    $redis_key_field=$ip;
    $val=1;
    $redis->hset($redis_key, $redis_key_field, $val);
}

function getHttpRequest ($url) {
    //初始化 curl
    $ch = curl_init();
    curl_setopt($ch, CURLOPT_URL, $url);
    curl_setopt($ch, CURLOPT_RETURNTRANSFER, 1);
    //显示header内容
    curl_setopt($ch, CURLOPT_HEADER, false);
    //模拟火狐浏览器头部
    curl_setopt($ch, CURLOPT_USERAGENT, 'Mozilla/5.0 (Windows NT 6.1; WOW64; rv:39.0) Gecko/20100101 Firefox/39.0');
    //不显示html内容
    #curl_setopt($ch, CURLOPT_NOBODY, 1);
    //如果有重定向、则继续获取重定向地址头部
    #curl_setopt($ch, CURLOPT_FOLLOWLOCATION, 1);
    $output = curl_exec($ch);
    
    //释放资源
    curl_close($ch);
    return $output;
}

lua代码

local redis = require "resty.redis"
local function redis_disallow()  
    local red = redis:new()  
    red:set_timeout(1000)  
    local ip = "127.0.0.1"  
    local port = 6379  
    local ok, err = red:connect(ip, port) 
    --local ok, err = red:connect("unix:/tmp/redis.sock")  
    if not ok then  
        ngx_log(ngx_ERR, "connect to redis error : ", err)  
        return close_redis(red)  
    end  
    --客户端IP
    local myIP = ngx.req.get_headers()["X-Real-IP"]
    if myIP == nil then
        myIP = ngx.req.get_headers()["x_forwarded_for"]
    end
    if myIP == nil then
        myIP = ngx.var.remote_addr
    end
    
    ngpage = red:hget("disallowIP",myIP)
   
    close_redis(red)
    --if  ngpage=="1" then 
    if  ngpage=="1" then  
        --ngx.say(ngpage)  
        ngx.exit(ngx.HTTP_FORBIDDEN)
    end  
    return nil  
end  

--reids ip禁言访问
redis_disallow()
QQ交流群:136351212(满) 455721967

如无特别说明,本站文章皆为原创,若要转载,务必请注明以下原文信息:
转载保留版权:小松博客» 阿里云违规URL屏蔽访问处理通知解决方法
本文链接地址:https://www.phpsong.com/3427.html

发表我的评论
取消评论
表情

Hi,您需要填写昵称和邮箱!

  • 昵称 (必填)
  • 邮箱 (必填)
  • 网址
木有头像就木有JJ!点这里按步骤申请Gravatar头像吧!

网友最新评论 (2)

加载中,请稍候...
  1. 文章不错支持一下吧
    今日新闻头条2017-10-23 12:03:19回复
  2. 也可以在阿里云控制台,绿网里面取消就可以了。还可以阿里云提交工单申请取消屏蔽。
    php自学网2017-11-09 10:43:18回复