前兩天,網站的注冊發送手機短信驗證碼的接口受到攻擊,一個半小時,1萬條短信都發出去了。可見,我們的安全防護做的多么不好。
分析攻擊方式:
1) 多台機器模擬人工操作,隨機輸入手機號,就點擊發送短信;
2) 多台機器上的部署的相同的腳本,在對網站發起攻擊;
針對可能的第一種攻擊方式: 在前端加了一個滑動解決的功能(一個jquery插件),必須手動拖動滑動解鎖,輸入框才是可點的;
針對可能的第二種攻擊方式,應對策略:
1)在服務端接口加上驗證,限制相同的IP,多長時間之內可以訪問幾次;限制相同的手機號,多長時間之內可以發送短信幾次;具體實現是在redis/memcache中存儲兩個值;key1=該IP第一次訪問的時間,key2=該IP總訪問的次數;比如10分鍾內可訪問3次,超過3次就不讓發送短信了。手機號的限制方式也是一樣的;
2)配置nginx,限制IP在一定時間內的訪問次數,以及同一時刻的並發數;
參考網址:http://boyseegirl.iteye.com/blog/2033717 (nginx限制特定ip的並發連接數)
http://blog.csdn.net/gebitan505/article/details/17610485 (nginx限制某個IP同一時間段的訪問次數)
http://blog.csdn.net/dingyingguidyg/article/details/8523421 (nginx利用limit模塊設置IP並發防CC攻擊)
http://blog.csdn.net/plunger2011/article/details/37812843 (nginx配置limit_conn_zone來限制並發連接數以及下載帶寬)
http{
.......
........
limit_req_zone $binary_remote_addr zone=one:10m rate=2r/s; #1秒發起2個請求)
limit_conn_zone $binary_remote_addr zone=perip:10m;
}
server{
location /{
limit_req zone=one burst=1 nodelay;
limit_conn perip 2; #連接數限
}
}
3)通過分析nginx的access日志,篩選出訪問量最高的IP,封掉;
按照某個時間點統計ip的訪問次數,並排序
cat access.log |grep "11/Nov/2015:12:30*" | awk '{print $1}' | sort | uniq -c | sort -rn > iptong.txt
篩選出IP之后新建一個blockIp.conf文件,文件內容為:
deny xx.xx.xx.xx ;
deny xx.xx.xx.xx ;
deny xx.xx.xx.xx ;
在nginx.conf中http{
include blockIp.conf;
}
重啟nginx , nginx -s reload 即可