你得把你的需求描述清楚,也就是说你的需求允许做什么,而不允许做什么。比如:网站可以启用 HTTPS 和不可以启用 HTTPS ,那么针对你的问题的解决方法就不同。
谢谢你的回答,如果网站没有启用HTTPS该怎么实现不加验证码防止机刷的效果呢?
@guwoow: 那只能一问一答了。
你的用户要求和IP绑定吗?
@Launcher: 谢谢你的回复,在局域网内,很多用户的外网IP都是同一个,用IP不合适吧?
@guwoow: 你不能问我,而是我问你有什么样的需求。你只要回答:不要求绑定IP。
验证码的基本作用是增加两次验证之间的时间间隔,其体现在两个方面:
1、在进行下一次验证前,客户端必须先获取新的验证码;
2、识别出验证需要一定的时间;
所以,我们可以简单的先实现 1 中的方式,服务器随机生成一个 Key(设置为 3 分钟超时),放置在表单的隐藏域中,验证时,服务器会验证此 Key 是否有效(存在于 Key 缓存中)。
@Launcher: 有点明白你的意思了,可是 3 分钟之内被别人恶意登录也很危险。实现 2 中的方式有什么方法?谢谢指教。
@guwoow: 你得先跟我说你如何恶意登录。
@Launcher: 用 .NET 里的 WebClient 类模拟提交,不论是 get 还是 post 方式都可以提交,只要知道地址栏参数名称或表单控件名称的就可以提交,无限循环的刷下去(就是回到上面没有验证码的情况下)。
@guwoow: 因为设置了 Key(在 3 分钟内有效,且只能使用一次),因此如果你使用 WebClient 模拟请求,那么你至少需要发起两次请求,第一次,从服务器获取 Key,然后你需要在 3 分钟内携带此 Key 和用户名、密码一起提交给服务器验证,服务器使用此 Key 后即废弃;如果你的用户名、密码验证不通过,则你需要重新获取该 Key 后才能再次重试 。
为了保证攻击者不在短时间内连续两次发起字典式攻击,我们可以将 Key 的产生时间人为的控制在 500 毫秒左右(此值根据用户体验来设置),还可以将用户名、密码的验证流程控制在 500 毫秒以上(此值根据用户体验来设置),这样,一次完整的验证至少需要 2 个请求,1 秒以上的时间,那么这就极大的减少了攻击者发起攻击的频率。 类似这种人为增加验证时间的机制在身份验证中很常见,比如我们的 Windows 的登录,就是用了一个简单的 while(true) 来拉长了验证时间。
那个文章说的很清楚啦,
你回答的和我问的不一样啊,就拿这个图片来说,没有验证码,如果被别人恶意刷机登陆,还不把服务器刷爆了?