• awk 统计日志中的ip和userId--分析用户恶意刷接口行为


    前段时间公司的领券接口,被人恶意盗刷,于是基于之前写的 redis的时间窗口限流功能,进行改进,同时支持可以针对ip  用户id 规则 动态可配置的流控黑名单拦截器,并对领券接口设定每秒钟请求超过5次,会把该用户加入黑名单一定的时间,前期一天能拦截几万次的请求,每个用户的请求qps 达到几百次,限流拦截后,后来就慢慢正常了。这两天接到反馈说配置了总可领取量为60的某个券,甚至没投放就几乎瞬间秒没,排查后发现,用户已经聪明的避开了限流规则,都没有命中限流加入黑名单规则,于是只能先导出请求的日志,进行分析。。。

    导出后每条请求日志格式如下第一条:

    命令:

    cat tf2.text |  awk -F "请求头:" '{print $2}' | awk -F ',' '{a[$5]++}  END{for(i in a)print i "-->"  a[i]}'

    说明:

    -F "请求头:" 

            -F 文本分割的标识,表示以  "请求头:" 进行分割,这样就把日志以"请求头:"分割成两段,很明显,第二段是我们需要继续去分析的,所以输出第二段 '{print $2}'

    '{print $2}'

            表示输出分割后的第二段内容,即截图中的下面那段内容

    awk -F ',' 

    因为我们要统计第二段内容中的ip和userid,所以我们需要继续分割,由文本可知,第二段可以根据 "," 进行分割,所以继续 标记分割  awk -F ','  , 如此分割后,则第二个会形成一个以逗号,分割而成的数组

    '{a[$5]++}  END{for(i in a)print i "-->"  a[i]}'

    $5表示取以逗号分割后的第五个字段,即期望统计的"x-original-client-ip":"60.205.226.35",

    {a[$5]++}中,a是随意定义的数组变量名称,这个名称可以随意定义,{a[$5]++}表示取第5个字段放到数组中,如果第五个字段值相同,则加1。

    END{for(i in a)print i "-->"  a[i]} ,END 表示统计结束,

    {for(i in a)print i "-->"  a[i]} 表示统计结束后,遍历数组a,并输出  数组的遍历数据及对应的统计数量

    统计结果

     同理找到用户的userId,进行统计

    cat tf2.text |  awk -F "请求头:" '{print $2}' | awk -F ',' '{a[$15]++}  END{for(i in a)print i "-->"  a[i]}'

    综上分析, 

    该盗刷接口者一秒钟更换ip 20多个,用来刷券的用户600多个,请求1600多次,近20秒内ip 600多个,用户仍为600多个,每个用户的请求基本都在5个以下,完美避开规则,真是道高一尺魔高一丈。。。。

    后续计划:

    1、会逐步分析这些用户,看是否必要直接加入黑名单

    2、目前券id为默认自增,不排除用户直接撞券的可能,这个风险也要规避(可以设置自增id自定义规则,也可以给每张券设置一个秘钥,领券的同时,必须携带秘钥才可)

    3、若基于2可以防止用户撞券,但是在券正常营销曝光后,用户拿到数据采取看似正常用户行为规则进行盗刷,如何风控,这是一个更复杂的问题,可能就需要综合分析该用户的行为和画像了

  • 相关阅读:
    学校介绍静态HTML网页设计作品 DIV布局学校官网模板代码 DW大学网站制作成品下载 HTML5期末大作业
    Android开发者的自我修养
    【Java初阶】- - - static 关键字
    串口波形分析
    [附源码]Python计算机毕业设计Django校刊投稿系统
    oj刷题-C语言版
    LeetCode_队列_中等_649.Dota2 参议院
    探索音频传输系统:数字声音的无限可能 | 百能云芯
    游戏测试相关 测试一个英雄的技能(春招被问比较多的一道题)
    【JAVA】多态的概念与实际利用
  • 原文地址:https://blog.csdn.net/tangfeng61/article/details/126201903