1

我正在 ASP.net MVC 1.0 中设计一个简单的注册表单我想允许在用户输入时验证用户名(根据下面链接的相关问题)

这一切都很容易。 但是这种功能的安全含义是什么?

我如何避免人们滥用它来确定有效用户名列表?

一些相关问题1、2

4

5 回答 5

3

为了防止对我的一些内部 ajax 内容进行“恶意”活动,我添加了两个 GET 变量,一个是日期(通常在纪元中),然后我将该日期添加一个盐和 SHA1,如果日期(重新散列时)与散列不匹配,然后我放弃请求,否则完成它。

当然,我在呈现页面之前进行加密并将哈希和日期传递给 JS。否则将毫无意义。

使用基于 IP/cookie 的限制的问题是两者都可以被绕过。使用具有良好的、加密强度高的盐的令牌方法(比如史蒂夫吉布森的“完美密码”之一https://www.grc.com/passwords.htm)将花费大量时间(在规模上数十年),然后才能可靠地预测该方法并确保一定程度的安全性。

于 2009-06-30T01:02:12.413 回答
0

您可以将请求数限制为每 10 秒左右 2 个(真正的用户可能会输入一个已使用的名称并稍作修改,然后再试一次)。有点像 SO 不允许您每 30 秒发表一次以上的评论。

如果你真的很担心,你可以采取上面的方法,计算他们在某个时间段内尝试了多少次,如果超过阈值,将他们踢到另一个页面。

于 2009-06-30T00:56:36.620 回答
0

验证如下:“此用户名已被占用”?如果您限制每秒的请求数,它应该会有所帮助

于 2009-06-30T00:57:15.323 回答
0

解决此问题的一种常见方法是简单地在请求中添加延迟。如果请求被发送到服务器,等待 1(或更多)秒响应,然后响应结果(如果名称有效或无效)。

添加时间障碍并不会真正影响不尝试抓取的用户,并且您已免费获得每分钟 60 个请求的限制。

于 2009-06-30T05:17:17.520 回答
0

以 UnkwnTech 提供的答案为基础,这是一些非常可靠的建议。

您可以更进一步,让客户端执行一些计算以创建返回哈希 - 这可能只是一些简单的算术运算,例如减去一些数字,添加数据并乘以 2。

添加的算术确实意味着开箱即用的用户名抓取脚本不太可能工作,并迫使客户端使用更多的 CPU。

于 2012-05-11T16:02:25.727 回答