00:00
看到关于这个恶意登陆的检测,我们已经基于之前的类似于这个温度连续上升检测,我们做了一个基本实现,这个实现思路非常简单,而且看起来呢,呃,好像也没什么问题,结果也是正确的,但是我们会想到它其实里边是包含了一些逻辑上的错误的,就是我们说的它其实跟温度连续上升不一样,温度连续上升我们关心的就是你固定的这个时间段内啊,这么长时间到底是不是发生了呃,连续上升的这样的一个状态,如果出现下降,我就直接把它清空重新来,而我们现在呢,你要检测连续登录失败,其实关于这个时间间隔并不是特别的重要啊,就是我们说的,你如果说现在我们检测的是两秒钟之内,那你假说是这个一秒钟之内他就连续登录失败了,难道说我们不应该检测到,然后把它提出报警吗?这也是一个要求,对吧,你其实。
01:00
一方面是从这个时效性讲,我们实时性讲,你已经发现它连续登录失败了,那你应该及时的做出一个报警和检测啊,你不要等到两秒钟之后再告诉我吧,那另外还有一个问题,就是说,如果说前面在这两秒钟之内啊,前一秒钟已经连续登录失败很多次了,十几20次,后边呢,它又刚好来了一个登录成功的用户正常登录的一个数据,那就会导致这两秒钟之内,我们相当于就认为它是正常的,对吧,就不做任何的报警提示了,这其实是有一些逻辑上的漏洞和风险的,所以接下来我们要给大家考虑怎么样去针对之前的这个代码做一个改进,大家可以想一下,就是当前我们这个代码可以做哪些方面的改进,可以改成相当于就是及时检测,一旦要是比方说像我们现在只有两次,连续两次登录失败,检测到就应该报警,对吧?哎,那我应该怎么样呢。是不是现在就又类似于之前我们保留上一次的状态,然后下一个数据来了之后,我立刻去做判断对不对?呃,一旦要是发现当前两次都是登录失败,而且它的这个时间,时间的这个差距啊,在两秒钟之内的话,我是不是就不要管后面什么定时器不定时器了,直接报警就完事了,对吧?哎,这其实也是另外一种实现思路,所以接下来我们在代码里边也给大家把这个稍微的来讲一讲啊,做一个实现,好,我们直接在下边新建一个object。
02:36
当前这个其实还是logging feel啊,我们这个叫做呃,Logging feel advance吧,其实大家知道,就是在之前的基础上,我们想做一些改进,对吧,先把这个创建出来,然后里边整体的处理流程,整体的处理流程其实大家想到基本上是差不多的啊,你像之前我们这个呃,创建环境,然后读取数据map成降力类啊,时间戳watermark,一直到后边再做具体的process操作之前那应该都一样,对吧,这里面没有任何的区别,所以直直到这个前面到这里为止啊,完整的都抄过来,甚至我这里可以直接把它流程全抄过来,后面我再去重新定义就好了。
03:24
先先把这个抄过来,呃,然后接下来大家会看到我们中间引入的这个包里边,比方说这个get plus,你就不要引入这个logving field里边的了,对吧?我们直接用当前这个类去get class就可以,然后注意把这个影视转换该引入还是要引入,然后我们检查一下前面创建环境,执行环境,做一些配置,后边读取数据,然后接下来map成样一类分配时间戳和这个提取watermark,然后接下来呢,诶,这里我们要做一个做一个改变对吧,做一个调整,我们之前做这个按照user ID做一个分分组,然后后边去实现了一个自定义的kid process function,其实大家发现现在我们要做的事情是不是也差不多啊,也是要根据那个呃UID去做分组,对吧?呃,你想我们这里如果说就是你你定义的这一个,呃,连续登录失败,如果说你连这个UID都不分组了的话,你直接来一个就去做判断,那你。
04:24
是不是相当于还得在里边再去判断是不是同一个uz ID,然后才能去说,诶是否连续登录失败,对吧,而且这个就是相当于还有一个问题,这个状态你没有办法直接按照这个k state直接根据K去做,呃,单独的那个独享的那个状态了,你相当于之前所有的登录失败,每一个user ID是不是都得保存起来啊,啊,这个就太麻烦了,对吧?啊,所以我们这里边还是根据user ID去做分组,然后接下来呢,呃,Process这里边我们再重新定义一个,之前我们那个叫log logging。
05:00
呃,Warning result对吧,接下来我们叫,呃,Loging feel warning advance result,稍微的改一下,其实里边核心还是要实现这样一个k process function,好,所以接下来我们写这个啊,Advance result,哎,那这里边K的process function,然后当前的KIO,那大家想这个其实跟之前完全没变化对吧?也就是我们这里前面的这个处理流程都一样嘛,所以这里的类型也完全一样,当前的K长整型输入输出,就是当前的这个样衣类类型,直接把它copy过来,后边诶我们要具体实现的就是一个process element方法了,每来一条数据都会调到这里来,之前我们是哎,先定义了那个各种状态,然后我们做了这个具体里边做了一些判断,对吧?啊,主要是做这些操作,然后。
06:01
现在我们要做的事情呢,大家想一想,是不是还是需要,就我这里边其实直接可以把这边copy过来啊,是不是还是需要有这样的一个,就是之前登录失败的一个状态呀,要把它保存起来对吧?诶那这里边为了方便扩展,我还是把之前登录的失败的事件全保存到一个list state里边啊这里现在大家可以想到我如果连续两次登录失败的话,好像比较简单,我好像只要保存一个value state就可以了,就是上一次登录失败存起来,那接下来我判断如果又失败了的话,跟上一次做对比对吧,然后符合条件我直接输出这个想法是很简单的,那假如说连续三次登录失败呢?啊,那那你大家想到我保存两个状态是吧,第一次登录失败和第二次登录失败保存两个,那五次登录失败呢,十次登录失败呢,啊,所以这个最好的方式我们想到还是用一个list state去保存啊,那所以这个其实看起来这个几乎我们可以把之前的这个大部分东西都。
07:01
都抄过来了对吧?诶这个没有没有copy上啊,好把这个copy过来,然后把这个list state这些都引入,那另外之前的状态里边还有一个时间戳的这个状态定时器,时间戳这个需要也也引入吗?大家会想到现在好像我们就不需要时间戳这个定时器了,是不是好像连定时器操作都不需要了,因为我们现在需要的就是什么呢?就是来一个数据,之前的那个登录失败都保存起来,然后来一个新的数据,假如是失败登录失败了,对吧?哎,那我就直接跟之前的那个数据去做一个判断判断,如果说他们俩之间的那个时间戳在两秒钟之内,差距在两秒之内的话,我直接输出报警不就完了吗?对吧?你不要等到两秒钟之后再去做这件事儿了,你你一来了,只要符合条件,符合标准,我直接给你输出了,这个是完全可以做到的,所以接下来我们其实就省略了定时器这一步,当然也就不需要保存时间戳了。
08:01
好,那大家看一看,接下来我们既然已经省略了定时器,那具体的处理逻辑应该是什么样的呢?首先是不是还还是先判断判断,诶当前这个类型对不对?判断事件登录,登录事件的类型到底是成功还是失败,大家想到我们主要要做的操作是不是主要是如果是失败的话才做更多的操作啊,那如果成功怎么办?如果遇到一个是success成功了怎么办?对,直接清空状态不就完了吗?对吧,就像我们之前也是清空状态,然后另外还涉及到一个删除定时器嘛,我现在既然没有定时器,直接清空状态不就完事了吗?哎,所以接下来我们看啊,If做一个判断,还是value.even type,假如说等于这有的话,大家看到这是如果,呃,是失败,那么接下来要去做进一步的判断,对吧?呃,进进一步做判断,那如果else else如果是成功的话,是不是状态直接清空啊,就前面的login fair list直接clear就好了,哎,所以这个其实是非常简单的一个一个if else的一个分分支情况的讨论啊,如果是成功直接。
09:35
清空状态,哎,所以这里边我们先在这写,这个是一,这个是二,对吧,然后接下来这个进一步做判断,我到底要判断什么呢?那是不是要判断我之前的那个列表里边,历史里边到底对我们现在连续两次登录失败吗?那你是要判断里边到底有没有来过,对吧?如果已经有了,有一个的话,那现在可以去判断它的时间戳了,要不要输出了,如果之前就没有,没有的话,那你就不用判断是不是直接塞进去完事了呀,对吧,他去等别人就完事了,所以接下来我们看看到啊,接下来是要啊,那为了要获取这个当前list里边的数据,我先把当前这个迭代器拿到对吧。
10:18
就当前logging fair list get,然后拿到当前的这个eer,所以接下来大家想到1.1,那那呃,这个我们继继续判断是吧,我们首先是要做一个判断啊,判断呃,之前是否有登录失败事件,哎,所以这里边其实就是判断当前这个迭代器是否has next对吧?哎,那这里边如果有的话,这是1.1分之如,哎,如果有,那么进一步判断两次失败的时间差对吧?呃,这里边我先把它放下啊,那else呢?如果如果要是没有呢?
11:13
如果没有,是不是非常简单,直接就把它,哎,这是1.2对吧?对,直接把当前这个添加进去就完事了,对吧?如果没有,直接把当前事件添加到list state中,哎,所以这里边我们直接用那个就是当前我们的那个log in fair list,直接ADD当前的这个value就完事了,对吧?哎,这是这个最基本的一个分支情况的讨论啊,然后接下来这个关键就在于如果有的话,这种情况下怎么办,对吧?啊,那接下来我们说是要再去判断它,它们两者之间的那个时间差,那我先得拿到当前的这个,呃,就是之前第一次登录失败的那个数据,对吧,我定一个那个first few event啊,用这个eat.next把它先拿出来,然后接下来是不是判断两者的时间差了value.time s。
12:14
哎,那假如说当前的这个时间戳,哎,大家知道,如果我要是小于first fair event,它的这个时间戳二再加二的话,大家注意,这里边我直接用的是数据里边的时间戳,哎,所以那相当于这个是秒数对吧?哎,这个就不要加2000,直接加二就完事了,如果我们当前的数据时间戳小于第一次登录失败的时间戳加二,那表示什么意思?不就是它俩的差在两秒钟之内嘛,对吧?你把这个移项移过来,不就是它减它小于二吗?如果在两秒钟之内的话,这个啊,如果在两秒之内输出报警对吧?哎,就直接报警就完事了,这里边怎么输出out.collect我们主流输出的就是这个报警信息,对吧?啊,这里边我们要用logging feel呃,应。
13:14
应该是叫warning对吧,Loging field warning看一眼是是这个样例类吧,是它对吧?这是我们的输出数据类型,然后里边包装的这个结果user ID,那你在value里边直接就有吗?啊然后呢,第一次登录失败是谁呢?当然是first few event的当前的时间戳,对吧?另外还有现在最后最近一次这次事件的时间戳time stamp,然后最后还有一个报警信息,哎,那这个报警信息大家发现我这里边其实就没有办法去统计,就是直接在这个代码里边去直接扩展,变成这个三次五次了,因为为什么我的逻辑这if else这里判断的就是只判断了两个对吧,你如果要是三次,三次连续登,呃,连续三次登录失败,大家想这里边得怎么判断,你是不是得看这里边是不是有里边已经有两个了,对吧,已经有两个了,然后你再去判断他们的那个时间戳是不是都在两秒钟之。
14:14
内啊,那那这个其实就复杂很多,所以这里边我们是只是判断这个连续两次登录失败啊,这里边的这个报警信息当然也就是logging feel啊呃,我们直接就是fail了两次对吧,Two times in,两秒之内啊,所以这其实就是直观的这么一个报警信息,然后大家看到这是如果在两秒钟之内,那就输出报警,那如果在两秒钟之外呢?两秒钟之外是不是就啥事都不做啊,对吧,就相当于这个你已经超过我们那个时间限制了嘛,那无所谓对吧,重新再开始记就可以了,然后另外还有一个问题,就是说不管报警不报警,是不是相当于我们之前的这个列表,这个信息就应该是状态,就应该删掉了,大家想想已经输出一次报警了,接下来如果再检测的话,我是不是就应该从头开始再检测啊,对吧,从当前最新的数据开始作为起始点,继续往后做检测,哎,所以。
15:14
接下来我们这里边可以给一个啊,就是我们不管报不报警。报不报警?呃,那么当呃当前都已处理完毕。那么我们可以把将。状态更新为最近一次登录失败的事件,诶,所以当前这个我们其实是没有把它清空,而是什么呢?哎,就是你当前不是又有一次登录失败吗?我当前这个数据不也是吗?哎,我默认它就是下一次的开始啊,这也算的对吧?啊,这也算是一种这个定义的方式,或者你直接清空不管了,等到接下来他来了之后,我再去从头开始也是一样的,对吧?啊,这就看你怎么定义了啊啊那所以这里边我可以呃,做这件事的话,那就是先把它做一个清空,然后再把当前的这个艾进去,这就完事了,对吧?啊,就是以当前这个数据作为下一次下一轮判断检测的一个起始点,这就是我们处理的这个过程,对吧?好,那接下来我们来运行一下,看看这个效果怎么样,大家看这个逻辑都已经处理完了,没有定时器对吧。
16:40
直接就是来一个处理一个,来一个处理一个,都用状态去保证,去去保持它的这个,呃,之前的状态啊,然后我们去做判断,好,那接下来我们运行一下,看看是否能够符合我们的预期。好,大家看到这里边我们已经运行起来,诶已经运行结束了,大家看同样的数据,我们检测之后检测到什么了呢?输出了两次报警,为什么会输出两次报警呢?诶,因为大家看到之前我们这个数据里边,其实在四二到四次之间,这是对连续三次这个登录失败对吧?我们之前检测的时候是干什么呢?是定义了一个,呃,四二的时候来了第一个登录失败,就注册了一个定时器,直接要等到两秒之后啊,四次过了之后我们才去检测,哎,是不是有这个两次以上登录失败啊,所以就直接检测出来三次登录失败,那我们现在是什么呢?是你看4243来了之后,我立刻就输出报警对吧?哎,我就直接判断啊,现在是两次登录失败,两秒钟之内两次登录失败,然后我如果以这个当前最新的一次四三登录失败作为下一次判断的开开开始的话,那四三和四是不。
17:55
相当于又是两秒钟之内两次登陆失败啊,所以大家看到他连续输出了两条这样的结果,这个还是符合我们预期的,对吧?哎,这就是对于之前我们做的连续登录失败检测的一个改进,相当于时效性就会更好,而且我们只要它符合标准,立刻可以输出结果检测出来。
我来说两句