登录接口被碰撞攻击怎么处理?

目前系统的账号密码登录接口有人再碰撞账号密码,之前前后端使用的AES 加密,因为key在前端写死的,所以加密基本没用。最初对方使用的同一个ip 后面拉黑了,现在使用的是动态的ip。接口是ios/android/web端都在用,通过header传的自定义的字段区分的,web端加了google的人机验证,对方就没有从web端攻击了,但是app 之前发布的版本是没有加google验证的,如果接口强行加上google验证,之前版本的app 就用不了。大佬们怎么处理这种情况更稳妥些?

本作品采用《CC 协议》,转载必须注明作者和本文链接
《L05 电商实战》
从零开发一个电商项目,功能包括电商后台、商品 & SKU 管理、购物车、订单管理、支付宝支付、微信支付、订单退款流程、优惠券等
《L01 基础入门》
我们将带你从零开发一个项目并部署到线上,本课程教授 Web 开发中专业、实用的技能,如 Git 工作流、Laravel Mix 前端工作流等。
讨论数量: 4

这就属于cc或者ddos攻击了,不同的ip,设备标识,服务端无法区分,可以上防火墙,或者专门的cc服务

22小时前 评论

AES 加密 肯定是没有加上时间戳的校验

// 生成签名
    protected function generateUserApplySign($headers, $secretKey): string
    {
        // 移除 Api-Sign 字段
        if (isset($headers['Api-Sign'])) {
            unset($headers['Api-Sign']);
        }
        ksort($headers);

        $buff = '';
        foreach ($headers as $k => $v) {
            if ($v != "" && !is_array($v)) {
                $buff .= $k . "=" . $v . "&";
            }
        }
        // 去除最后一个&
        $string = trim($buff, "&");
        // 在string后加入KEY
        $string = $string . "&key=" . $secretKey;
        // sha256加密
        $string = hash_hmac('SHA256', $string, $secretKey);
        // 所有字符转为大写
        return strtoupper($string);
    }

  /**
     * 签名验证
     * @param Request $request
     * @return bool
     * @throws InvalidRequestException
     */
    protected function verifyUserApplySign(Request $request): bool
    {
        $requiredHeaders = ['Api-Appid', 'Api-Nonce-Str', 'Api-Timestamp', 'Api-Sign'];

        foreach ($requiredHeaders as $header) {
            if (!$request->headers->has($header)) {
                throw new InvalidRequestException($header . ' 不能为空');
            }
        }
        // 判断 Api-Appid 是否正确
        $userApplySecret = UserApplySecret::query()->where('app_id', $request->headers->get('Api-Appid'))->first();
        if (!$userApplySecret) {
            throw new InvalidRequestException('Api-Appid 不存在');
        }
        if (!$userApplySecret['is_valid']) {
            throw new InvalidRequestException('Api-Appid 已失效');
        }
        // 判断是否过期
        if (Carbon::now()->gt($userApplySecret['valid_at'])) {
            throw new InvalidRequestException('Api-Appid 已过期');
        }
        // 判断请求次数是否超限
        if ($userApplySecret['request_count'] >= $userApplySecret['available_count']) {
            throw new InvalidRequestException('Api-Appid 请求次数已超限');
        }

        $headers = [
            'Api-Appid'     => $request->headers->get('Api-Appid'),
            'Api-Nonce-Str' => $request->headers->get('Api-Nonce-Str'),
            'Api-Timestamp' => $request->headers->get('Api-Timestamp'),
            'Api-Sign'      => $request->headers->get('Api-Sign'),
        ];

        if ($userApplySecret['time_out'] && !$this->allowTimestamp($headers['Api-Timestamp'], $userApplySecret['time_out'])) {
            throw new InvalidRequestException('Api-Timestamp 超时');
        }

        // 生成签名
        $sign = $this->generateUserApplySign($headers, $userApplySecret['secret_key']);

        Log::info('Api-User-Sign: ', ['generateUserApplySign' => $sign, 'Api-User-Sign' => $headers['Api-Sign']]);

        if (!hash_equals($sign, $headers['Api-Sign'])) {
            throw new InvalidRequestException('Api-Sign 不正确');
        }
        // 请求成功, 记录请求次数
        $userApplySecret->increment('request_count');

        return true;
    }
21小时前 评论

兼容性补救措施:
1、自动封IP,从请求信息里面多分析攻击者特征,有相同特征的都封掉,一般的攻击者,IP资源有限的。
2、同一账号限制登录频率。
3、将库里的简单密码用户,全部清理掉密码,后续登录让他们走密码修改流程。(和产品协商)

2小时前 评论

讨论应以学习和精进为目的。请勿发布不友善或者负能量的内容,与人为善,比聪明更重要!