机器多次恶意提交攻击简单防范

先说背景:机器不断的发送请求或者恶意提交,会给服务器造成很大压力;针对这种攻击最优的策略是判断提交次数,产生动态验证码,即判断ip规定时间内重复发送达到N次弹出验证码。下面是小拽在实践过程中一个简单的识别ip,利用session记录和防御的过程。

识别和校验ip

过程如下;

  • 识别ip
  • ip属于白名单直接通过[白名单策略:内网ip+指定ip表]
  • 利用session存储ip的请求时间戳
  • 校验规定时间内ip的请求次数
  • 采取相应的措施
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
/**
* 获取和校验ip;同时防止短时间内多次提交
*
* @notice :弹出验证码,需要替换掉echo $echo_str 即可。
* @return string :返回校验成功的ip
*/
protected function getAndCheckIP()
{
// 获取环境ip
if (getenv("HTTP_CLIENT_IP") && strcasecmp(getenv("HTTP_CLIENT_IP"), "unknown"))
$ip = getenv("HTTP_CLIENT_IP");
else if (getenv("HTTP_X_FORWARDED_FOR") && strcasecmp(getenv("HTTP_X_FORWARDED_FOR"), "unknown"))
$ip = getenv("HTTP_X_FORWARDED_FOR");
else if (getenv("REMOTE_ADDR") && strcasecmp(getenv("REMOTE_ADDR"), "unknown"))
$ip = getenv("REMOTE_ADDR");
else if (isset($_SERVER['REMOTE_ADDR']) && $_SERVER['REMOTE_ADDR'] && strcasecmp($_SERVER['REMOTE_ADDR'], "unknown"))
$ip = $_SERVER['REMOTE_ADDR'];
else
$ip = "unknown";
// check 环境ip
if (!$this->isWhiteList($ip)) {
$echo_str = "提交过于频繁,请稍后再试!";
// 构建ip的时间栈数据
if (!is_array($_SESSION[$ip])) {
$_SESSION[$ip] = array();
}
if (isset($_SESSION[$ip][0])) {
$_SESSION[$ip][] = time();
// session 保存时间为6小时。清理session
$post_interval_first = time() - $_SESSION[$ip][0];
if ($post_interval_first > 21600) {
$_SESSION[$ip] = array();
}
// 两次提交小于1s,禁止提交
$post_interval_pre = time() - $_SESSION[$ip][count($_SESSION[$ip]) - 3];
if ($post_interval_pre < 1) {
echo $echo_str;
exit;
};
// 您在10s内已经提交了3请求,禁止提交
$post_interval_third = time() - $_SESSION[$ip][count($_SESSION[$ip]) - 3];
if (isset($_SESSION[$ip][3]) && ($post_interval_third < 10)) {
echo $echo_str;
exit;
}
// 您在1分钟期间已经提交了5请求,禁止提交
$post_interval_fifth = time() - $_SESSION[$ip][count($_SESSION[$ip]) - 3];
if (isset($_SESSION[$ip][5]) && ($post_interval_fifth < 60)) {
echo $echo_str;
exit;
}
// 6小时内提交10次,禁止提交
if (isset($_SESSION[$ip][10])) {
echo $echo_str;
exit;
}
} else {
$_SESSION[$ip][] = time();
}
}
return ($ip);
}

白名单策略

白名单策略采用:内网ip放行和特定ip放行

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
/**
* 检验是否存在于白名单中
*
* @param $ip :校验的ip
* @return bool :校验结果
*/
function isWhiteList($ip){
/**
* 内网ip默认全部存在于白名单中
*/
if(!filter_var($ip, FILTER_VALIDATE_IP, FILTER_FLAG_NO_PRIV_RANGE | FILTER_FLAG_NO_RES_RANGE)){
return true;
}
// 是否在写死的whitelist 里面
return in_array($ip,$this->_WHTTE_LIST);
}

防攻击策略

小拽采用的比较简单的策略,如上面代码,实际过程中可以结合业务需求。

  • 1s内禁止重复提交
  • 5s内提交上限3次
  • 60s内提交上限5次
  • 6小时内提交上限10次

【转载请注明:机器多次恶意提交攻击简单防范 | 靠谱崔小拽

崔小拽 wechat
欢迎您扫一扫上面的微信公众号,订阅小拽的博客!