作者热门文章
- html - 出于某种原因,IE8 对我的 Sass 文件中继承的 html5 CSS 不友好?
- JMeter 在响应断言中使用 span 标签的问题
- html - 在 :hover and :active? 上具有不同效果的 CSS 动画
- html - 相对于居中的 html 内容固定的 CSS 重复背景?
我有一个密码页面,当有人输入不正确的密码时,我想通过以下方式简单地挫败暴力攻击
bool isGoodPassword = (password == expected_password);
lock (this)
{
if (!isGoodPassword)
Thread.Sleep(2000);
}
我希望这将允许所有正确的密码而不会停止,但如果一个用户输入了错误的密码,另一个来自不同用户的成功密码也会被阻止。但是,该锁似乎无法跨 ASP.NET 线程lock
。没有意义。
最佳答案
好吧,您还没有显示“this”是什么,但是如果您在页面的上下文中...每个请求都会获得它自己的页面实例,不是吗?否则他们一开始怎么会有不同的密码?您将有多个线程,每个线程锁定一个单独的对象。
从许多方面来说,这是一件好的事情:您不希望真正的用户受到攻击者的影响。另一方面,这意味着攻击者只需要同时进行几次尝试,就可以有效地忽略你挫败他的企图。正如其他答案所述,您可以通过使用单个对象来解决这个问题 - 但请不要这样做。不要忘记 IIS 不会无限创建新线程:这种方法将允许单个攻击者使您的整个应用程序无法供所有用户使用,不仅用于身份验证,而且整个应用程序都无法使用。 .而且他们甚至不需要有效密码。
相反,您可能希望考虑记录身份验证失败的 IP 地址,并限制您愿意以这种方式处理的请求数量。 (诚然,如果某些用户与攻击者使用同一代理,这可能会对某些用户造成问题,但这种可能性较小。)这不会阻止分布式攻击,但这是一个好的开始。
关于c# - 为什么 lock(this) thread.sleep 不适用于 ASP.NET 线程?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/3121292/
我是一名优秀的程序员,十分优秀!