资讯专栏INFORMATION COLUMN

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

honhon / 822人阅读

摘要:先说背景机器不断的发送请求或者恶意提交,会给服务器造成很大压力针对这种攻击最优的策略是判断提交次数,产生动态验证码,即判断规定时间内重复发送达到次弹出验证码。

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

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

文章版权归作者所有,未经允许请勿转载,若此文章存在违规行为,您可以联系管理员删除。

转载请注明本文地址:https://www.ucloud.cn/yun/21307.html

相关文章

  • 【Step-By-Step】一周面试题深入解析 / 周刊 03

    摘要:禁止内联脚本执行规则较严格,目前发现使用。合理使用上报可以及时发现,利于尽快修复问题。因为事件会从目标元素一层层冒泡至对象。允许给一个事件注册多个监听。表示在捕获阶段触发,表示在冒泡阶段触发。 关于【Step-By-Step】 Step-By-Step (点击进入项目) 是我于 2019-05-20 开始的一个项目,每个工作日发布一道面试题。每个周末我会仔细阅读大家的答案,整理最一份...

    hedge_hog 评论0 收藏0
  • 【面试篇】寒冬求职之你必须要懂的Web安全

    摘要:禁止内联脚本执行规则较严格,目前发现使用。典型的攻击流程受害者登录站点,并保留了登录凭证。站点接收到请求后,对请求进行验证,并确认是受害者的凭证,误以为是无辜的受害者发送的请求。攻击完成,攻击者在受害者不知情的情况下,冒充受害者完成了攻击。 随着互联网的发展,各种Web应用变得越来越复杂,满足了用户的各种需求的同时,各种网络安全问题也接踵而至。作为前端工程师的我们也逃不开这个问题,今天一起...

    yeyan1996 评论0 收藏0
  • 【面试篇】寒冬求职之你必须要懂的Web安全

    摘要:禁止内联脚本执行规则较严格,目前发现使用。典型的攻击流程受害者登录站点,并保留了登录凭证。站点接收到请求后,对请求进行验证,并确认是受害者的凭证,误以为是无辜的受害者发送的请求。攻击完成,攻击者在受害者不知情的情况下,冒充受害者完成了攻击。 随着互联网的发展,各种Web应用变得越来越复杂,满足了用户的各种需求的同时,各种网络安全问题也接踵而至。作为前端工程师的我们也逃不开这个问题,今天...

    charles_paul 评论0 收藏0

发表评论

0条评论

最新活动
阅读需要支付1元查看
<