先说背景:机器不断的发送请求或者恶意提交,会给服务器造成很大压力;针对这种攻击最优的策略是判断提交次数,产生动态验证码,即判断ip规定时间内重复发送达到n次弹出验证码。下面是小拽在实践过程中一个简单的识别ip,利用session记录和防御的过程。
识别和校验ip
过程如下;
识别ip
ip属于白名单直接通过[白名单策略:内网ip+指定ip表]
利用session存储ip的请求时间戳
校验规定时间内ip的请求次数
采取相应的措施
/** * 获取和校验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
白名单策略
白名单策略采用:内网ip放行和特定ip放行
/** * 检验是否存在于白名单中 * * @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次
【转载请注明:机器多次恶意提交攻击简单防范 | 靠谱崔小拽 】
以上就介绍了机器多次恶意提交攻击简单防范,包括了方面的内容,希望对php教程有兴趣的朋友有所帮助。