作为对最近Twitter 劫持和Jeff 在 Dictionary Attacks 上的帖子的回应,保护您的网站免受暴力登录攻击的最佳方法是什么?
Jeff 的帖子建议为每次尝试登录增加延迟,评论中的建议是在第二次失败尝试后添加验证码。
这两个似乎都是好主意,但你怎么知道它是什么“尝试次数”?您不能依赖会话 ID(因为攻击者每次都可以更改它)或 IP 地址(更好,但容易受到僵尸网络的攻击)。使用延迟方法简单地将其登录到用户名可以锁定合法用户(或至少使登录过程对他们来说非常慢)。
想法?建议?
作为对最近Twitter 劫持和Jeff 在 Dictionary Attacks 上的帖子的回应,保护您的网站免受暴力登录攻击的最佳方法是什么?
Jeff 的帖子建议为每次尝试登录增加延迟,评论中的建议是在第二次失败尝试后添加验证码。
这两个似乎都是好主意,但你怎么知道它是什么“尝试次数”?您不能依赖会话 ID(因为攻击者每次都可以更改它)或 IP 地址(更好,但容易受到僵尸网络的攻击)。使用延迟方法简单地将其登录到用户名可以锁定合法用户(或至少使登录过程对他们来说非常慢)。
想法?建议?
我认为给定帐户(1-5 分钟)的数据库持续短暂锁定期是处理此问题的唯一方法。数据库中的每个都userid包含一个timeOfLastFailedLogin和numberOfFailedAttempts。当numbeOfFailedAttempts > X你锁定几分钟。
这意味着您将有问题的userid问题锁定一段时间,但不是永久锁定。这也意味着您正在为每次登录尝试更新数据库(当然,除非它被锁定),这可能会导致其他问题。
亚洲至少有一个国家被 NAT'ed,所以 IP 不能用于任何事情。
在我看来,有几种可能性,每种都有优缺点:
如您所见,“好的”解决方案都取决于用户的选择,这再次表明用户是链条中最薄弱的元素。
还有其他建议吗?
你可以做谷歌所做的事情。经过一定次数的尝试后,他们会显示验证码。比使用验证码几次后,您将它们锁定几分钟。
我倾向于同意大多数其他评论:
我确实想指出的是,您应该非常小心地强制使用“强”密码,因为这通常意味着它们只会写在桌子上的便利贴上/连接到显示器上。此外,一些密码策略会导致更可预测的密码。例如:
如果密码不能是任何以前使用过的密码并且必须包含一个数字,那么它很可能是任何普通密码,后面有一个序列号。如果您必须每 6 个月更改一次密码,并且一个人已经在那里工作了两年,那么他们的密码很可能类似于password4。
假设您对其进行了更多限制:必须至少有 8 个字符,不能有任何连续字母,必须有字母、数字和特殊字符(这是许多人认为安全的真正密码策略)。试图闯入约翰昆西史密斯的账户?知道他是 3 月 6 日出生的吗?他的密码很有可能是jqs0306 之类的!(或者可能是 jqs0306~)。
现在,我并不是说让您的用户拥有密码密码也是一个好主意,只是不要自欺欺人地认为您的强制“安全”密码是安全的。
krosenvold 说的:在用户表中记录 num_failed_logins 和 last_failed_time(用户被挂起时除外),一旦登录失败的次数达到阈值,你就将用户挂起 30 秒或一分钟。这是最佳实践。
该方法有效地消除了单帐户暴力破解和字典攻击。但是,它并不能阻止攻击者在用户名之间切换 - 即。保持密码固定并尝试使用大量用户名。如果您的网站有足够的用户,那么这种攻击可以持续很长时间,然后才会用完未暂停的帐户来攻击。希望他会从单个 IP 运行此攻击(虽然不太可能,因为这些天僵尸网络确实成为交易工具),因此您可以检测到并阻止 IP,但如果他正在分发攻击......好吧,那是另一个问题(我刚刚在这里发布,所以如果您没有请检查一下)。
关于最初的想法要记住的另一件事是,即使帐户受到攻击和暂停,您当然仍然应该尝试让合法用户通过 - 也就是说,如果您可以区分真实用户和机器人。
你可以,至少有两种方式。
如果用户有一个持久登录(“记住我”)cookie,就让他通过。
当您显示“对不起,由于大量登录尝试失败,您的帐户已被暂停”消息时,请包含一个链接,上面写着“安全备份登录 - 仅限人类(机器人:不撒谎) ”。开个玩笑,当他们点击该链接时,给他们一个 reCAPTCHA 身份验证的登录表单,绕过帐户的暂停状态。这样,如果他们是人类并且知道正确的登录名和密码(并且能够读取验证码),他们将永远不会受到延迟的困扰,并且您的网站将不会受到快速攻击。
唯一的缺点:有些人(例如视力受损的人)无法阅读验证码,如果他们不使用自动登录功能,他们可能仍会受到恼人的机器人产生的延迟的影响。
什么不是缺点:自动登录 cookie 没有内置类似的安全措施。你问,为什么这不是一个缺点?因为只要您明智地实现了它,登录 cookie 中的安全令牌(等效密码)就是您的密码的两倍(哎呀,让它多十倍!),所以暴力破解它是实际上是一个非问题。但是,如果您真的很偏执,也可以在自动登录功能上设置一秒钟的延迟,以防万一。
为此,您应该在与后端数据库无关的应用程序中实现缓存。
首先,仅延迟合法的用户名会导致您“放弃”您的有效客户群,即使用户名不是一个严密保护的秘密,这本身也可能是一个问题。
其次,根据您的应用程序,您可以使用特定于应用程序的延迟对策比将数据存储在数据库中更聪明一些。
它可以抵抗将 DOS 条件泄漏到后端数据库的高速尝试。
最后,根据 IP 做出一些决定是可以接受的……如果您看到一个 IP 的单次尝试,那么它可能是一个诚实的错误,而多个 IP 天知道您可能想要采取其他预防措施或通知最终用户有多少系统阴暗的活动。
其真正的大型代理联盟可以保留大量 IP 地址供其使用,但由于某些站点习惯于将 cookie 数据与 IP 绑定,因此大多数代理联盟确实会尽合理努力将源地址维护一段时间以用于遗留目的。
像大多数银行一样,在 X 次登录失败后锁定用户名/帐户。但我不会像银行那样严格,因为你必须打电话来解锁你的账户。我只会在 1-5 分钟内临时锁定。当然,除非 Web 应用程序像银行一样对数据敏感。:)
我认为您应该再次登录用户名。这是唯一的常数(其他任何东西都可以被欺骗)。是的,它可以将合法用户锁定一天。但是,如果我必须在被黑帐户和关闭帐户(一天)之间进行选择,我肯定会选择锁定。
顺便说一句,在第三次尝试失败后(在一定时间内),您可以锁定帐户并向所有者发送释放邮件。该邮件包含解锁帐户的链接。这对用户来说是一个轻微的负担,但破解器被阻止了。而且,即使邮件帐户被黑客入侵,您也可以设置每天解锁次数的限制。
这是一个旧帖子。但是,我想把我的发现放在这里,以便它可以帮助任何未来的开发人员。
我们需要防止暴力攻击,使攻击者无法获取网站登录的用户名和密码。在许多系统中,它们有一些开放式 url,不需要身份验证令牌或 API 密钥进行授权。这些 API 中的大多数都很关键。例如; 注册、登录和忘记密码 API 通常是开放的(即不需要验证身份验证令牌)。我们需要确保服务不被滥用。如前所述,我只是将我的发现放在这里,同时研究如何有效地防止暴力攻击。
这篇文章已经讨论了大多数常见的预防技术。我想补充一下我对帐户锁定和 IP 地址锁定的担忧。我认为锁定帐户作为一种预防技术是个坏主意。我在这里提出一些观点来支持我的事业。
帐户锁定不好
帐户的 IP 地址锁定也是一个坏主意
另一种解决方案是锁定多次登录失败的 IP 地址。此解决方案的问题在于,您可能会通过阻止 ISP 或大公司使用的代理服务器来无意中阻止大量用户。另一个问题是,许多工具使用代理列表,并且只从每个 IP 地址发送几个请求,然后再继续下一个。在http://tools.rosinstrument.com/proxy/等网站上使用广泛可用的开放代理列表,攻击者可以轻松绕过任何 IP 阻止机制。由于大多数网站在密码失败后不会阻止,因此攻击者可以对每个代理进行两次或三次尝试。拥有 1,000 个代理列表的攻击者可以尝试 2,000 或 3,000 个密码而不会被阻止。尽管如此,尽管这种方法存在弱点,但遭受大量攻击的网站,尤其是成人网站,确实会选择阻止代理 IP 地址。
我的提议
命题解释
故意延迟响应
密码验证延迟显着减慢了攻击者的速度,因为攻击的成功取决于时间。一个简单的解决方案是在检查密码时注入随机暂停。在大多数合法用户登录其帐户时,即使添加几秒钟的暂停也不会打扰他们。
请注意,虽然添加延迟可能会减慢单线程攻击,但如果攻击者同时发送多个身份验证请求,则效果会降低。
安全挑战
这种技术可以被描述为基于用户在早期使用系统时执行的操作的自适应安全挑战。如果是新用户,此技术可能会引发默认的安全挑战。
我们可能会考虑在何时提出安全挑战?有几点我们可以做到。
用户可能面临什么样的安全挑战?
API监控面板
为 API 调用构建监控面板。
对于内部系统帐户,我们可能会考虑只允许从某些 IP 地址登录。如果需要锁定帐户,而不是完全锁定帐户,请将其置于功能有限的锁定模式。
这里有一些不错的读物。
您可以添加某种形式的验证码测试。但请注意,它们中的大多数会使眼睛或听力受损的人更难接触。一种有趣的验证码形式是问一个问题,
2和2之和是多少?
如果你记录了最后一次登录失败,如果验证码足够老,你可以跳过验证码。如果最后一次失败是在最后 10 分钟内,则仅进行 CAPTCHA 测试。
我在线登录的许多在线留言板都让我尝试登录帐户 5 次,在这 5 次尝试之后,帐户被锁定一小时或十五分钟。它可能不漂亮,但这肯定会减慢对一个帐户的字典攻击。现在没有什么可以阻止同时针对多个帐户的字典攻击。即尝试5次,切换到另一个帐户,再尝试5次,然后圈回来。但它确实会减慢攻击速度。
对字典攻击的最佳防御是确保密码不在字典中!!!基本上设置某种密码策略,根据字母检查字典并要求密码中包含数字或符号。这可能是对字典攻击的最佳防御。
对于 .NET 环境
IIS 的动态 IP 限制扩展为 IT 专业人员和主机提供了一个可配置的模块,该模块通过临时阻止遵循以下模式的 HTTP 客户端的 Internet 协议 (IP) 地址来帮助减轻或阻止拒绝服务攻击或通过暴力破解密码有利于其中一种攻击。可以配置此模块,以便可以在 Web 服务器或网站级别进行分析和阻止。
IIS 的动态 IP 限制允许您通过检查请求的源 IP 并识别可能发出攻击信号的模式来降低 Web 服务器遭受拒绝服务攻击的可能性。当检测到攻击模式时,模块会将有问题的 IP 放入临时拒绝列表中,并在预定时间内避免响应请求。
IIS 的动态 IP 限制能够检测指示尝试解码 Web 服务器密码的请求模式。该模块会将有问题的 IP 放置在预定时间内被拒绝访问的服务器列表中。在针对 Active Directory 服务 (ADS) 进行身份验证的情况下,该模块能够通过避免向 ADS 发出身份验证质询来维持 Web 服务器的可用性。
无缝集成到 IIS 7.0 管理器中。
根据以下任一条件动态阻止来自 IP 地址的请求:
并发请求数。
一段时间内的请求数。
支持允许绕过动态 IP 限制过滤的 IP 列表。
请求的阻止可以在网站或 Web 服务器级别进行配置。
可配置的拒绝操作允许 IT 管理员指定将返回给客户端的响应。模块支持返回状态码 403、404 或关闭连接。
支持 IPv6 地址。
支持可能修改客户端 IP 地址的代理或防火墙后面的 Web 服务器。
旧帖子,但让我在 2016 年底发布我所拥有的内容。希望它仍然可以提供帮助。
这是一种简单的方法,但我认为防止登录攻击很强大。至少我总是在我的每个网站上使用它。我们不需要 CAPTCHA 或任何其他第三方插件。
当用户第一次登录时。我们创建一个像
$_SESSION['loginFail'] = 10; // any number you prefer
如果登录成功,那么我们将销毁它并让用户登录。
unset($_SESSION['loginFail']); // put it after create login session
但是如果用户失败,我们通常会向他们发送错误消息,同时我们将会话减少 1 :
$_SESSION['loginFail']-- ; // reduce 1 for every error
如果用户失败 10 次,那么我们会将他们引导到其他网站或任何网页。
if (!isset($_SESSION['loginFail'])) {
if ($_SESSION['login_fail'] < 1 ) {
header('Location:https://google.com/'); // or any web page
exit();
}
}
通过这种方式,用户无法再打开或进入我们的登录页面,因为它已重定向到其他网站。
用户必须关闭浏览器(以销毁我们创建的会话 loginFail),“再次”打开它以“再次”看到我们的登录页面。
有帮助吗?
有几个方面需要考虑以防止暴力破解。考虑给定的方面。
密码强度
强制用户创建密码以满足特定条件
通过创建最小密码强度策略,暴力破解将花费时间来猜测密码。同时,您的应用程序可以识别并迁移它。
重新验证码
您可以使用 reCaptcha 来防止机器人脚本具有暴力破解功能。在 Web 应用程序中实现 reCaptcha 相当容易。您可以使用Google reCaptcha。它有多种 reCaptcha 风格,例如 Invisible reCaptcha 和 reCaptcha v3。
动态 IP 过滤策略
如果该模式与攻击向量标准匹配,您可以动态识别请求模式并阻止 IP。过滤登录尝试的最流行的技术之一是Throttling. 阅读使用 php 的节流技术以了解更多信息。良好的动态 IP 过滤策略还可以保护您免受DoS和DDos. 但是,这无助于预防DRDos。
CSRF 预防机制
被csrf称为cross-site request forgery。表示其他站点正在您的 PHP 脚本/控制器上提交表单。Laravel有一个非常明确的方法来防止csrf. 但是,如果您不使用这样的框架,则必须设计自己的JWT基于 csrf 的预防机制。如果您的网站受 CSRF 保护,则没有机会对您网站上的任何表单进行暴力破解。就像你关闭的大门一样。