首页 新闻 会员 周边 捐助

请教登录时既不需要输入验证码,又能防止别人刷机的办法。

0
悬赏园豆:10 [已解决问题] 解决于 2013-08-27 11:51

今天在博客园知识库中看到这边文章从登录开始,有一个疑问就是登录时既不需要输入验证码,又能防止别人刷机该怎么办?

web
guwoow的主页 guwoow | 小虾三级 | 园豆:611
提问于:2013-08-26 10:08
< >
分享
最佳答案
1

你得把你的需求描述清楚,也就是说你的需求允许做什么,而不允许做什么。比如:网站可以启用 HTTPS 和不可以启用 HTTPS ,那么针对你的问题的解决方法就不同。

收获园豆:8
Launcher | 高人七级 |园豆:45050 | 2013-08-26 10:15

谢谢你的回答,如果网站没有启用HTTPS该怎么实现不加验证码防止机刷的效果呢?

guwoow | 园豆:611 (小虾三级) | 2013-08-26 15:30

@guwoow: 那只能一问一答了。

你的用户要求和IP绑定吗?

Launcher | 园豆:45050 (高人七级) | 2013-08-26 15:32

@Launcher: 谢谢你的回复,在局域网内,很多用户的外网IP都是同一个,用IP不合适吧?

guwoow | 园豆:611 (小虾三级) | 2013-08-27 09:08

@guwoow: 你不能问我,而是我问你有什么样的需求。你只要回答:不要求绑定IP。

验证码的基本作用是增加两次验证之间的时间间隔,其体现在两个方面:

1、在进行下一次验证前,客户端必须先获取新的验证码;

2、识别出验证需要一定的时间;

所以,我们可以简单的先实现 1 中的方式,服务器随机生成一个 Key(设置为 3 分钟超时),放置在表单的隐藏域中,验证时,服务器会验证此 Key 是否有效(存在于 Key 缓存中)。

Launcher | 园豆:45050 (高人七级) | 2013-08-27 09:17

@Launcher: 有点明白你的意思了,可是 3 分钟之内被别人恶意登录也很危险。实现 2 中的方式有什么方法?谢谢指教。

guwoow | 园豆:611 (小虾三级) | 2013-08-27 09:50

@guwoow: 你得先跟我说你如何恶意登录。

Launcher | 园豆:45050 (高人七级) | 2013-08-27 10:21

@Launcher: 用 .NET 里的 WebClient 类模拟提交,不论是 get 还是 post 方式都可以提交,只要知道地址栏参数名称或表单控件名称的就可以提交,无限循环的刷下去(就是回到上面没有验证码的情况下)。

guwoow | 园豆:611 (小虾三级) | 2013-08-27 10:33

@guwoow: 因为设置了 Key(在 3 分钟内有效,且只能使用一次),因此如果你使用 WebClient 模拟请求,那么你至少需要发起两次请求,第一次,从服务器获取 Key,然后你需要在 3 分钟内携带此 Key 和用户名、密码一起提交给服务器验证,服务器使用此 Key 后即废弃;如果你的用户名、密码验证不通过,则你需要重新获取该 Key 后才能再次重试 。

为了保证攻击者不在短时间内连续两次发起字典式攻击,我们可以将 Key 的产生时间人为的控制在 500 毫秒左右(此值根据用户体验来设置),还可以将用户名、密码的验证流程控制在 500 毫秒以上(此值根据用户体验来设置),这样,一次完整的验证至少需要 2 个请求,1 秒以上的时间,那么这就极大的减少了攻击者发起攻击的频率。 类似这种人为增加验证时间的机制在身份验证中很常见,比如我们的 Windows 的登录,就是用了一个简单的 while(true) 来拉长了验证时间。

Launcher | 园豆:45050 (高人七级) | 2013-08-27 10:43
其他回答(2)
0

那个文章说的很清楚啦,

Rookier | 园豆:652 (小虾三级) | 2013-08-26 10:09

你回答的和我问的不一样啊,就拿这个图片来说,没有验证码,如果被别人恶意刷机登陆,还不把服务器刷爆了?

支持(0) 反对(0) guwoow | 园豆:611 (小虾三级) | 2013-08-26 10:16
1

验证码是肯定需要的,但你可以只在某些条件下触发验证码

相关博问:多次登录错误后需要输入验证码

收获园豆:2
dudu | 园豆:31030 (高人七级) | 2013-08-26 15:55
清除回答草稿
   您需要登录以后才能回答,未注册用户请先注册