博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
机器多次恶意提交攻击简单防范
阅读量:5773 次
发布时间:2019-06-18

本文共 2835 字,大约阅读时间需要 9 分钟。

先说背景:机器不断的发送请求或者恶意提交,会给服务器造成很大压力;针对这种攻击最优的策略是判断提交次数,产生动态验证码,即判断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 < 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放行

/** * 检验是否存在于白名单中 * * @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次

【转载请注明: | 】

你可能感兴趣的文章
2012年电信业八大发展趋势
查看>>
Web日志安全分析工具 v2.0发布
查看>>
JS重载
查看>>
python2和python3同安装在Windows上,切换问题
查看>>
php加速工具xcache的安装与使用(基于LNMP环境)
查看>>
android超链接
查看>>
redhat tomcat
查看>>
统计数据库大小
查看>>
IO流的学习--文件夹下文件的复制
查看>>
第十六章:脚本化HTTP
查看>>
EXCEL表中如何让数值变成万元或亿元
查看>>
nginx在响应request header时候带下划线的需要开启的选项
查看>>
Linux下DHCP服务器配置
查看>>
AndroidStudio中导入SlidingMenu报错解决方案
查看>>
我的IDEA配置
查看>>
myeclipse显示行号
查看>>
编写高性能的java程序
查看>>
Spring 的配置详解
查看>>
linux已经不存在惊群现象
查看>>
上位机和底层逻辑的解耦
查看>>