真实案例:

查看nginx日志,发现别有用心的人恶意调用API接口刷短信:

 115.213.229.38 "-" [/Jun/::: +] 0.003 xxxxxx.com "POST /xxx/sendCheckCode HTTP/1.1"    xx.xx.xx.xx: 0.003  "Mozilla/5.0 (Windows NT 6.1; WOW64; rv:27.0) Gecko/20100101 Firefox/27.0" "https://xxxxxx/sendCheckCode"
60.181.111.140 "-" [/Jun/::: +] 0.004 xxxxxx.com "POST /xxx/sendCheckCode HTTP/1.1" xx.xx.xx.xx: 0.004 "Mozilla/5.0 (Windows NT 6.1; WOW64; rv:27.0) Gecko/20100101 Firefox/27.0" "https://xxxxxx/sendCheckCode"
220.190.18.25 "-" [/Jun/::: +] 0.003 xxxxxx.com "POST /xxx/sendCheckCode HTTP/1.1" xx.xx.xx.xx: 0.003 "Mozilla/5.0 (Windows NT 6.1; WOW64; rv:27.0) Gecko/20100101 Firefox/27.0" "https://xxxxxx/sendCheckCode"

思考了几种方案,最终考虑使用ip黑名单的方式:

处理方法:

一、nginx黑名单方式:

1、过滤日志访问API接口的IP,统计每10分钟调用超过100次的IP,直接丢进nginx的访问黑名单

2、具体步骤:

编写shell脚本:

vim /shell/nginx_cutaccesslog.sh
#!/bin/bash
log_path=/xxx/nginx/logs
date=`date -d "10 min ago" +%Y%m%d-%H:%M:%S`
nginxpid=`cat ${log_path}/nginx.pid`
cd ${log_path}
#过滤access.log中正常访问API接口并在10分钟(下面是日志切割,再做个定时任务每10分钟执行一次,就可以实现了)内访问量最高的30个IP,取值如果此IP访问量大于100次,则把此IP放入黑名单
cat access.log | grep sendCheckCode | grep -v | awk '{print $2}'|sort|uniq -c | sort -k1 -n | tail - | awk '{if($1>100) print "deny "$2";"}' > ../conf/denyip.conf
#日志切割,做定时任务,每10分钟执行一次
mv ${log_path}/access.log ${log_path}/accesslog.bak/access_${date}.log
../sbin/nginx -s reload

可自己定义时间间隔和访问量,也可取消筛选访问量最高的30个,直接取值每10分钟访问接口超过100次的

其中:"grep -v 403" 是把已经禁止访问的IP给过滤掉,只筛选正常访问的

3、修改nginx.conf

在http模块加入:

include       denyip.conf;

重新加载nginx生效。

4、添加计划任务:

*/ * * * * /bin/bash /shell/nginx_cutaccesslog.sh > /dev/null >&

5、验证:

[root@xxx logs]# ll accesslog.bak/
-rw-r--r-- root root Jun : access_20180605-::.log
-rw-r--r-- root root Jun : access_20180605-::.log
-rw-r--r-- root root Jun : access_20180605-::.log
-rw-r--r-- root root Jun : access_20180605-::.log
[root@xxx logs]# cat ../conf/denyip.conf
…………
…………
deny 112.12.137.28;
deny 183.167.237.229;
deny 111.41.43.58;
deny 115.217.117.159;
deny 219.133.100.133;
deny 171.221.254.115;
deny 60.184.131.6;
…………
…………

再查看已经禁用IP的访问日志,则会返回403错误:

[root@xxx logs]# tail -f access.log | grep "60.184.131.6"
60.184.131.6 "-" [/Jun/::: +] 0.000 xxxxxx.com "POST /xxxxxx/sendCheckCode HTTP/1.1" 403 - - - "Mozilla/5.0 (Windows NT 6.1; WOW64; rv:27.0) Gecko/20100101 Firefox/27.0" "https://xxxxxx/sendCheckCode"
60.184.131.6 "-" [/Jun/::: +] 0.000 xxxxxx.com "POST /xxxxxx/sendCheckCode HTTP/1.1" 403 - - - "Mozilla/5.0 (Windows NT 6.1; WOW64; rv:27.0) Gecko/20100101 Firefox/27.0" "https://xxxxxx/sendCheckCode"
60.184.131.6 "-" [/Jun/::: +] 0.000 xxxxxx.com "POST /xxxxxx/sendCheckCode HTTP/1.1" 403 - - - "Mozilla/5.0 (Windows NT 6.1; WOW64; rv:27.0) Gecko/20100101 Firefox/27.0" "https://xxxxxx/sendCheckCode"

二、限制IP请求数:

处理这种情况的方法还有一种是限制单 IP 单位时间的请求数,以及单 IP 的并发连接数

此方法没有实际运用,因为感觉这种方法会误杀正常的访问用户

写一下此方法的大概配置,http模块加入:

http {
limit_req_zone $binary_remote_addr zone=one:10m rate=8r/s;
server {
location /search/ {
limit_req zone=one burst=;
}

如何估算 limit_req_zone size:

一兆字节区域可以保持大约1万6064字节的状态。

那么 10M 就可以存储 16 万的 IP 统计信息, 这个对普通应用足够了,16 万每秒的 UV,已经超级厉害了。

如果 size 的大小如果设置小了, 例如设置成 1M,那么当一秒内的请求 IP 数超过 16000 的时候,超出的 IP 对应的用户看到的均为 503 Service Temporarily Unavailable 页面了。参考, 漏桶算法 Leaky Bucket。 同时,rate 的单位用 r/s 非常合适,如果换成按天,按小时计数,10M 的内存肯定不够用。

如何估算 limit_req_zone rate:

首先需要知道的是,普通浏览器的同时并发数量。按照 Dropbox 技术博客里所谈到的,目前主流浏览器限制 AJAX 对同一个子域名的并发连接数是6个。IE 6,IE 7 是两个。

大多数浏览器每个主机名都有6个并发连接的限制。

PS:以上就是感觉比较良好的防御恶意IP刷网站的两种方法,如果你有更好的方法,不妨留言讨论一下!

nginx限制IP恶意调用短信接口处理方法的更多相关文章

  1. 发送短信验证码及调用短信接口与C# 后台 post 发送

    #region 调用短信接口 public ActionResult Mobile(string Tel)//调用接口 { Random rm = new Random(); int i; strin ...

  2. C#调用短信接口(通过简单的工厂模式整合多个短信平台)

    using System; using System.Collections.Generic; using System.IO; using System.Linq; using System.Net ...

  3. asp调用短信接口实现用户注册

    前几天做一个asp语言开发的网站需要实现用户注册短信验证功能,就研究了一下如何实现,简单给大家分享下调用过程. 首先需要找到一个第三方短信接口,当时用的是动力思维乐信的短信接口. 首先需要先注册个动力 ...

  4. destoon短信接口修改方法

    destoon是很优秀的B2B行业站程序.程序模块化开发契合度很高,二次开发起来也很顺畅.数据缓存,权限分配,SEO功能方面都不错. 但是在使用这套程序的时候,常常要用到发送短信的功能,而destoo ...

  5. C# 调用短信接口

    using System; using System.Collections.Generic; using System.IO; using System.Linq; using System.Net ...

  6. http请求,HttpClient,调用短信接口

    项目中安全设置找回密码的功能,需要通过发送短信验证绑定手机,通过绑定的手机号验证并重新设置密码. 因为项目是通过maven管理的,所以需要在pom.xml文件中引入jar包, maven引入的jar包 ...

  7. java代码实现调用短信接口,发送短信验证。

    一.代码示例 package com.aaa.zxf.login; import org.apache.commons.httpclient.HttpClient; import org.apache ...

  8. 调用短信接口,先var_dump()看数据类型是object需要json_decode(json_encode( $resp),true)转换成array

    返回的数据.先看类型,如果是object类型 先json_encode, 再json_decode,加true 转换成数组 $resp = $c->execute($req); var_dump ...

  9. 遇到短信轰炸,别人换ip调你的短信接口怎么办

    前端开发者很容易暴露自己的请求地址和参数,我们都知道,一个h5页面,按 F12 是可以看到页面的源码的,所以经常很多人会利用这一点恶意调取别人的接口. 我们公司出现了好多次短信接口被大量调用,导致一天 ...

随机推荐

  1. 如何在Eclipse/Myeclipse/Scala IDEA for Eclipse 中正确删除已经下载过的插件(图文详解)

    不多说,直接上干货! 见 Eclipse/Myeclipse/Scala IDEA for Eclipse里两种添加插件的方法(在线和离线) 第一步 :在菜单栏中,找到help-------insta ...

  2. 【随笔】使用apt-spy来更新你的debian源

    debian什么最方便,当然是用apt-get intsall 命令来安装软件了.使用apt-get什么最重要,自然是下载源了. debian版本自带的源肯定不是最快的,考虑到个人所处的位置.网速等方 ...

  3. 【Lua】关于遍历指定路径下所有目录及文件

    关于Lua中如何遍历指定文件路径下的所有文件,需要用到Lua的lfs库. 首先创建一个temp.lua文件,用编辑器打开: 要使用lfs库,首先需要把lfs库加载进来 require("lf ...

  4. nginx内网代理为外网地址

    #user nobody; worker_processes 1; #error_log logs/error.log; #error_log logs/error.log notice; #erro ...

  5. Struts2入门介绍(二)

    一.Struts执行过程的分析. 当我们在浏览器中输入了网址http://127.0.0.1:8080/Struts2_01/hello.action的时候,Struts2做了如下过程: 1.Stru ...

  6. vue+cordova项目

    教你用Cordova打包Vue项目   现在国内越来越多的开发者使用Vue开发混合app,但是当大家开发完成过后才发现不知道该怎么将Vue项目打包成app.据我现在的了解打包Vue项目目前流行的就是使 ...

  7. [转]微信小程序-template模板使用

    本文转自:http://blog.csdn.net/u013778905/article/details/59646241 如下图,我在做华企商学院小程序的时候,课程搜索结果页和课程列表页结构是完全一 ...

  8. java swing画图片爱心

    第一次用swing做一个可视化程序,写第一篇随笔,有写的不好的地方请多多见谅.上个星期三在网上看到一个画爱心的软件,就想着自己用java也实现一个程序,画爱心用到的数学函数知识在网上百度的,不是本人原 ...

  9. sql server query to get the list of column name in a table

    --SQL Server 2005, 2008 or 2012: SELECT * FROM information_schema.tables --SQL Server 2000: SELECT * ...

  10. 浅谈jquery中prop()和attr()

    我们都知道,一般在jquery中设置属性时要用到attr()方法,现在我们有一个效果,点击按钮切换复选框的选中状态,下面贴出html代码: <input type="checkbox& ...