8
回答
如何防止模拟提交大量登录请求从字典中匹配用户名和密码
百度AI开发者大赛带你边学边开发,赢100万奖金,加群:418589053   

如上题,做技术的束手无策,在开会激烈讨论,我觉得最快的临时办法就是加参数然后掐断。

我不是做程序开发的,请问专业的同志,这个全面的解决办法,谢谢。

举报
waney
发帖于6年前 8回/1K+阅

以下是问题补充:

  • @waney :discuz的验证码,验证问题,失败多次直接封一段时间, 均无效。 (6年前)
共有8个答案 最后回答: 6年前

你这个问题可以抽象一下。令每个用户和每个IP存在一个以时间轴为基础的登陆数组(一维,下标是历史时间到现在的时间差,值是对应时间片比如分钟内的总登陆次数)。需要有以下基准动作。

每个时间,比如分钟,对整个数组进行移动。

当有新登陆上来,检测整个时间窗内的登陆总次数,比如你的时间窗是30分钟。如果总次数超过你设定的K(30),则对其禁止T(30)。如果没有超过K(30),你对时间窗最后的数据,进行较窄窗口(例如10分钟)再判断。如果总次数超过 K(10) 则对其禁止T(10)。如果小于 K(10),则对最小窗口进行判断,例如10分钟,如果总次数超过K(1),则对其禁止 T(10)。

禁止过程中,该IP,该用户被直接否定,但是上述对应数组的内容,仍然根据时间进行移动修正。将较老的数据刷掉。

当然这个是原理算法。如果这个算法思路符合你的目标。则后续会需要有优化的简化算法。基本思路是压缩上述所谓“数组”的存储空间,以及压缩上述刷新和移动,判断的计算步骤。

上述具备IP和用户对应的数组是动态的。每分钟,刷新时,需要将即便下一分钟产生一次登陆但不存在禁止的数组给删除掉。

而所谓数组,是通过bit来描述,比如每4个bit表示当前的分钟内的登录次数,如果是15次以上,假设你一定会禁止他,则仍然等于15次。类似这样。

而在刷新左移时,对每个分钟的登陆次数,修正加权值,并反馈到最新存储空间内,此时所有的判断都集中在最新存储空间判断,而不用任意判断都要累加操作。这种近似的优化算法,只要能达到目的就可以了。没有必要考虑因为精度问题导致结果的不完全一致性。

--- 共有 2 条评论 ---
中山野鬼回复 @waney : 其实很简单。但是我难得搞公式编辑器了。 6年前 回复
waney好复杂 听不懂,谢谢你。 6年前 回复

登陆验证码,

登陆验证问题,

同用户名访问失败多次直接封用户一段时间,

如果还是继续尝试失败,直接封IP。

以上为个人意见。

--- 共有 3 条评论 ---
waney回复 @JustForFly : 因为discuz有这些,根本起不到作用。 6年前 回复
JustForFly那我就不知道你还想要什么了 6年前 回复
waneydiscuz 这些都有的 6年前 回复

增加验证码,可避免一些简单的模拟登录;

增加登录失败次数检查,超过N次后禁用用户或IP若干时间;

--- 共有 1 条评论 ---
waneydiscuz 都有的 6年前 回复
直接把用户隐射到MAP,不用查数据库,直接查询MAP
--- 共有 2 条评论 ---
一号男嘉宾先把数据库的用户查出来,引射到一个map对象,然后用户登录就直接去map对象里面匹配,比如5分钟或者10分钟把在把map里面的用户和数据库同步一次,呵呵,这个办法有点傻。 6年前 回复
waney这个怎讲?听不懂。 6年前 回复
这个事情很麻烦,一楼的方法是有效的。但是是针对用户存在IP绑定信息的情况下。当然大多数时刻也是如此。如果抽象来看,楼主也说了,模拟提交,或者从不同IP上大量测试用户名的方式,回避一楼的方案。这个问题但抽象的来看,几乎无解,因为问题和设计目标是矛盾的。还要看楼主其他方面的需求。最终想防止什么。
--- 共有 4 条评论 ---
中山野鬼回复 @waney : 延迟,如果发现不匹配,SERVER等待2到3秒后在告知客户端。但客户端会采用无论是否回复,仍然发送新用户方式。 6年前 回复
waney回复 @中山野鬼 : ip是变化的,验证那些都没有用,如果拒绝这类特定请求的频率过高的。 6年前 回复
中山野鬼回复 @waney : 两个方案。延迟,绑定IP的锁定。前者方法很多,那些图片内部字符识别本身就是个延迟目的。不是考智商用的。 6年前 回复
waney有人模拟大量提交,匹配然后获得匹配正确的用户名和密码。 6年前 回复

既然是字典匹配 那肯定会出现大量 同一账号使用不同的错误密码登陆的记录了..

可以从这方面下手...我的方案是:当检测到某一账号在一段时间内连续输错密码达到一定次数

则帐号进入内部锁定状态.当该帐号成功登陆之后,将无法进行任何操作.而是会进入一个锁定页面.

系统会要求该帐号进行解锁操作.解锁成功后,才能继续操作.

至于解锁操作的话最简单就是发一封邮件给用户注册邮箱,用户根据邮件提示解锁.

这样即使别人凭字典匹配到了密码也没用.而且一旦用户登陆之后发现自己的帐号被锁定就知道肯定有人尝试破解自己帐号的密码.那么此时也可以提示用户修改密码.这样最大限度的可以保证帐号安全了。

--- 共有 3 条评论 ---
酒逍遥而且我没说要禁止...只是帐号置为 内部锁定状态. 你只需要检测用户是否登陆的时候检测是否处于锁定状态就可以了. 基本上只需要加一个字段和一小段代码的 6年前 回复
酒逍遥呵呵 如果别人第一次就匹配到了密码 你怎么能知道这个人是不是帐号的拥有者呢. 不可能有100% 完美解决的方案的. 6年前 回复
waney你不能保证别人不会第一次就匹配到正确的啊。而且全都加入禁止,那量不是一般的大啊,所以 我想寻求一个彻底的办法就是如何设置条件抛弃这个请求。 6年前 回复

当然 上述方法也有缺陷.如果有人恶意用错误的密码尝试登陆某一账号将导致该帐号的用户每次登陆都要进行解锁操作.

那么就还需要一些其他的补充措施来进行完善了.例如:可设置一段时间内 帐号禁止进入锁定状态。

楼主,你这个是个博弈的过程。主要策略是延缓对方或者将对方行为区别于正常用户。如果是绑定IP比如3,4次登陆就锁定1分钟,对方可以替换IP,只要IP数量N足够多。上限仍然由他的IP数量决定。

如果你认为1分钟内如果登陆4次以上,就锁定这个IP30分钟。他完全可以每个IP每分钟就登陆4次,则没分钟也达到了4万次的用户访问检测。

但攻击者的IP数量如果不是非常多时,你可以尝试累计对IP进行长时间累计滤波观测。如果一个IP在1分钟内登录4次,在5分钟内登陆 10次,在30分钟内登陆 20次,则均对其锁定。

这样的目的是降低攻击者独立IP的使用价值。以和传统用户行为区别开来。

我先吃饭。回头给你个算法描述,解决这种问题。动态时间窗内的信号检测。
--- 共有 1 条评论 ---
waney谢谢。 6年前 回复
顶部