真实案例:
查看nginx日志,发现别有用心的人恶意调用API接口刷短信:
30966487 115.213.229.38 "-" [05/Jun/2018:14:37:29 +0800] 0.003 xxxxxx.com "POST /xxx/sendCheckCode HTTP/1.1" 401 200 46 xx.xx.xx.xx:0000 0.003 200 "Mozilla/5.0 (Windows NT 6.1; WOW64; rv:27.0) Gecko/20100101 Firefox/27.0" "https://xxxxxx/sendCheckCode" 30963985 60.181.111.140 "-" [05/Jun/2018:14:37:29 +0800] 0.004 xxxxxx.com "POST /xxx/sendCheckCode HTTP/1.1" 401 200 46 xx.xx.xx.xx:0000 0.004 200 "Mozilla/5.0 (Windows NT 6.1; WOW64; rv:27.0) Gecko/20100101 Firefox/27.0" "https://xxxxxx/sendCheckCode" 30959954 220.190.18.25 "-" [05/Jun/2018:14:37:29 +0800] 0.003 xxxxxx.com "POST /xxx/sendCheckCode HTTP/1.1" 401 200 46 xx.xx.xx.xx:0000 0.003 200 "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 403 | awk '{print $2}'|sort|uniq -c | sort -k1 -n | tail -30 | 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、添加计划任务:
*/10 * * * * /bin/bash /shell/nginx_cutaccesslog.sh > /dev/null 2>&1
5、验证:
[root@xxx logs]# ll accesslog.bak/ -rw-r--r-- 1 root root 2663901 Jun 5 15:10 access_20180605-15:00:01.log -rw-r--r-- 1 root root 13696947 Jun 5 15:20 access_20180605-15:10:01.log -rw-r--r-- 1 root root 13265509 Jun 5 15:30 access_20180605-15:20:01.log -rw-r--r-- 1 root root 13846297 Jun 5 15:40 access_20180605-15:30:01.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" 31268622 60.184.131.6 "-" [05/Jun/2018:15:47:34 +0800] 0.000 xxxxxx.com "POST /xxxxxx/sendCheckCode HTTP/1.1" 377 403 168 - - - "Mozilla/5.0 (Windows NT 6.1; WOW64; rv:27.0) Gecko/20100101 Firefox/27.0" "https://xxxxxx/sendCheckCode" 31268622 60.184.131.6 "-" [05/Jun/2018:15:47:35 +0800] 0.000 xxxxxx.com "POST /xxxxxx/sendCheckCode HTTP/1.1" 377 403 168 - - - "Mozilla/5.0 (Windows NT 6.1; WOW64; rv:27.0) Gecko/20100101 Firefox/27.0" "https://xxxxxx/sendCheckCode" 31268622 60.184.131.6 "-" [05/Jun/2018:15:47:35 +0800] 0.000 xxxxxx.com "POST /xxxxxx/sendCheckCode HTTP/1.1" 377 403 168 - - - "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=5; }
如何估算 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个并发连接的限制。
总结
以上所述是小编给大家介绍的nginx限制IP恶意调用短信接口处理方法,希望对大家有所帮助,如果大家有任何疑问请给我留言,小编会及时回复大家的。在此也非常感谢大家对小牛知识库网站的支持!
本文向大家介绍nginx修改配置限制恶意爬虫频率,包括了nginx修改配置限制恶意爬虫频率的使用技巧和注意事项,需要的朋友参考一下 如何在nginx中限制恶意网络爬虫抓取内容呢?也就是限制下恶意爬虫的抓取频率。下面来一起看看。 今天在微博发现@金荣叶 的处理方法很灵活,可以动态设定一个爬虫的频率,达到减轻服务器负载,并且不至于封杀爬虫。 超过设置的限定频率,就会给spider一个503。 总结 以
问题内容: 我的应用程序有一个按钮可以启动默认的短信活动,它在所有android版本(新版本Android 4.4(kitkat)除外)上都能正常工作,代码如下: 我收到错误消息 我知道Google对默认短信应用程序处理短信意图的方式进行了一些更改。但是我的应用程序不是短信应用程序,它仅具有使用收件人号码启动默认短信应用程序的功能。所以请帮忙 问题答案: 要使用填充的数字启动SMS应用程序,请执行
本文向大家介绍Android接收和发送短信处理,包括了Android接收和发送短信处理的使用技巧和注意事项,需要的朋友参考一下 关于短信接收处理方面,当前已经有一些app做的比较好了,比如发给手机发验证码验证的问题,很多app在手机接收到验证码后,不需要输入,就直接可以跳过验证界面,这就是用到了对接收到的短信的处理。至于短信的发送,也没什么好说的了。在此也只是附上一个小实例。 效果图: MainA
问题内容: 在IceCreamSandwch和JellyBean中,默认触发限制是30分钟内来自任何程序包的30条SMS。过去一小时内过去是100条SMS,这不是一个问题,但是现在我们需要注意应用发送的消息数量。 搜索并搜索之后,我找不到任何有关如何查询软件包当前限制的示例,这是我们必须在自己的软件包中维护的东西,还是Android API中某个隐藏的方法? 如果我们自己的程序包必须保持当前限制,
我试图使用USB调制解调器发送短信(我有一个D-Link Usb调制解调器)。我刚刚找到SmsLib,但我不知道如何使用USB调制解调器。我找到的例子是串行调制解调器,我没有找到任何USB调制解调器的例子。我需要将usb端口映射为串行端口吗?使用什么?我的调制解调器由SmsLib支持。您对如何使用SmsLib配置USB调制解调器有任何想法吗? (我有一台MacBook)。
监控系统产生报警事件之后需要发送报警邮件或者报警短信,各个公司可能有自己的邮件服务器,有自己的邮件发送方法;有自己的短信通道,有自己的短信发送方法。falcon为了适配各个公司,在接入方案上做了一个规范,需要各公司提供http的短信和邮件发送接口。 短信发送http接口: method: post params: - content: 短信内容 - tos: 使用逗号分隔的多个手机号 邮