53

作为对最近Twitter 劫持Jeff 在 Dictionary Attacks 上的帖子的回应,保护您的网站免受暴力登录攻击的最佳方法是什么?

Jeff 的帖子建议为每次尝试登录增加延迟,评论中的建议是在第二次失败尝试后添加验证码。

这两个似乎都是好主意,但你怎么知道它是什么“尝试次数”?您不能依赖会话 ID(因为攻击者每次都可以更改它)或 IP 地址(更好,但容易受到僵尸网络的攻击)。使用延迟方法简单地将其登录到用户名可以锁定合法用户(或至少使登录过程对他们来说非常慢)。

想法?建议?

4

14 回答 14

42

我认为给定帐户(1-5 分钟)的数据库持续短暂锁定期是处理此问题的唯一方法。数据库中的每个都userid包含一个timeOfLastFailedLoginnumberOfFailedAttempts。当numbeOfFailedAttempts > X你锁定几分钟。

这意味着您将有问题的userid问题锁定一段时间,但不是永久锁定。这也意味着您正在为每次登录尝试更新数据库(当然,除非它被锁定),这可能会导致其他问题。

亚洲至少有一个国家被 NAT'ed,所以 IP 不能用于任何事情。

于 2009-01-08T13:31:19.677 回答
37

在我看来,有几种可能性,每种都有优缺点:

强制使用安全密码

  • Pro:将防止字典攻击
  • 缺点:也会阻止流行,因为大多数用户无法记住复杂的密码,即使您向他们解释如何轻松记住它们。例如,通过记住句子:“我在商场里以 5 美分的价格买了 1 个苹果”会导致“Ib1Af5CitM”。

多次尝试后锁定

  • Pro : 会减慢自动化测试
  • 缺点:很容易为第三方锁定用户
  • 缺点:让它们在数据库中持久化可能会导致 Twitter 或类似服务等大型服务中的大量写入过程。

验证码

  • 优点:它们阻止了自动化测试
  • 缺点:他们正在消耗计算时间
  • 缺点:会“减慢”用户体验
  • 巨大的骗局:它们不是无障碍的

简单的知识检查

  • Pro : 会阻止自动化测试
  • 缺点:旁观者眼中的“简单”。
  • 缺点:会“减慢”用户体验

不同的登录名和用户名

  • 优点:这是一种技术,几乎看不到,但在我看来,这是防止暴力攻击的一个很好的开始。
  • 缺点:取决于用户对这两个名称的选择。

使用整个句子作为密码

  • :增加可能性的可搜索空间的大小。
  • Pro:对于大多数用户来说更容易记住。
  • 缺点:取决于用户的选择。

如您所见,“好的”解决方案都取决于用户的选择,这再次表明用户是链条中最薄弱的元素。

还有其他建议吗?

于 2009-01-08T13:48:41.857 回答
13

你可以做谷歌所做的事情。经过一定次数的尝试后,他们会显示验证码。比使用验证码几次后,您将它们锁定几分钟。

于 2009-01-08T14:48:42.737 回答
11

我倾向于同意大多数其他评论:

  • X 次密码尝试失败后锁定
  • 对用户名的失败尝试计数
  • 可选择使用 CAPTCHA(例如,尝试 1-2 是正常的,尝试 3-5 是 CAPTCHA'd,进一步的尝试被阻止 15 分钟)。
  • (可选)向帐户所有者发送电子邮件以删除阻止

我确实想指出的是,您应该非常小心地强制使用“强”密码,因为这通常意味着它们只会写在桌子上的便利贴上/连接到显示器上。此外,一些密码策略会导致可预测的密码。例如:

如果密码不能是任何以前使用过的密码并且必须包含一个数字,那么它很可能是任何普通密码,后面有一个序列号。如果您必须每 6 个月更改一次密码,并且一个人已经在那里工作了两年,那么他们的密码很可能类似于password4

假设您对其进行了更多限制:必须至少有 8 个字符,不能有任何连续字母,必须有字母、数字和特殊字符(这是许多人认为安全的真正密码策略)。试图闯入约翰昆西史密斯的账户?知道他是 3 月 6 日出生的吗?他的密码很有可能是jqs0306 之类的!(或者可能是 jqs0306~)。

现在,我并不是说让您的用户拥有密码密码也是一个好主意,只是不要自欺欺人地认为您的强制“安全”密码是安全的。

于 2009-01-08T14:18:43.263 回答
7

详细说明最佳实践:

krosenvold 说的:在用户表中记录 num_failed_logins 和 last_failed_time(用户被挂起时除外),一旦登录失败的次数达到阈值,你就将用户挂起 30 秒或一分钟。这是最佳实践。

该方法有效地消除了单帐户暴力破解和字典攻击。但是,它并不能阻止攻击者在用户名之间切换 - 即。保持密码固定并尝试使用大量用户名。如果您的网站有足够的用户,那么这种攻击可以持续很长时间,然后才会用完未暂停的帐户来攻击。希望他会从单个 IP 运行此攻击(虽然不太可能,因为这些天僵尸网络确实成为交易工具),因此您可以检测到并阻止 IP,但如果他正在分发攻击......好吧,那是另一个问题(我刚刚在这里发布,所以如果您没有请检查一下)

关于最初的想法要记住的另一件事是,即使帐户受到攻击和暂停,您当然仍然应该尝试让合法用户通过 - 也就是说,如果您可以区分真实用户和机器人。

你可以,至少有两种方式。

  1. 如果用户有一个持久登录(“记住我”)cookie,就让他通过。

  2. 当您显示“对不起,由于大量登录尝试失败,您的帐户已被暂停”消息时,请包含一个链接,上面写着“安全备份登录 - 仅限人类(机器人:不撒谎) ”。开个玩笑,当他们点击该链接时,给他们一个 reCAPTCHA 身份验证的登录表单,绕过帐户的暂停状态。这样,如果他们是人类并且知道正确的登录名和密码(并且能够读取验证码),他们将永远不会受到延迟的困扰,并且您的网站将不会受到快速攻击。

唯一的缺点:有些人(例如视力受损的人)无法阅读验证码,如果他们不使用自动登录功能,他们可能仍会受到恼人的机器人产生的延迟的影响。

什么不是缺点:自动登录 cookie 没有内置类似的安全措施。你问,为什么这不是一个缺点?因为只要您明智地实现了它,登录 cookie 中的安全令牌(等效密码)就是您的密码的两倍(哎呀,让它多十倍!),所以暴力破解它是实际上是一个非问题。但是,如果您真的很偏执,也可以在自动登录功能上设置一秒钟的延迟,以防万一。

于 2009-01-26T08:08:51.383 回答
5

为此,您应该在与后端数据库无关应用程序中实现缓存。

首先,仅延迟合法的用户名会导致您“放弃”您的有效客户群,即使用户名不是一个严密保护的秘密,这本身也可能是一个问题。

其次,根据您的应用程序,您可以使用特定于应用程序的延迟对策比将数据存储在数据库中更聪明一些。

它可以抵抗将 DOS 条件泄漏到后端数据库的高速尝试。

最后,根据 IP 做出一些决定是可以接受的……如果您看到一个 IP 的单次尝试,那么它可能是一个诚实的错误,而多个 IP 天知道您可能想要采取其他预防措施或通知最终用户有多少系统阴暗的活动。

其真正的大型代理联盟可以保留大量 IP 地址供其使用,但由于某些站点习惯于将 cookie 数据与 IP 绑定,因此大多数代理联盟确实会尽合理努力将源地址维护一段时间以用于遗留目的。

于 2009-01-08T13:48:41.250 回答
4

像大多数银行一样,在 X 次登录失败后锁定用户名/帐户。但我不会像银行那样严格,因为你必须打电话来解锁你的账户。我只会在 1-5 分钟内临时锁定。当然,除非 Web 应用程序像银行一样对数据敏感。:)

于 2009-01-08T13:38:58.867 回答
3

我认为您应该再次登录用户名。这是唯一的常数(其他任何东西都可以被欺骗)。是的,它可以将合法用户锁定一天。但是,如果我必须在被黑帐户和关闭帐户(一天)之间进行选择,我肯定会选择锁定。

顺便说一句,在第三次尝试失败后(在一定时间内),您可以锁定帐户并向所有者发送释放邮件。该邮件包含解锁帐户的链接。这对用户来说是一个轻微的负担,但破解器被阻止了。而且,即使邮件帐户被黑客入侵,您也可以设置每天解锁次数的限制。

于 2009-01-08T13:32:05.260 回答
3

这是一个旧帖子。但是,我想把我的发现放在这里,以便它可以帮助任何未来的开发人员。

我们需要防止暴力攻击,使攻击者无法获取网站登录的用户名和密码。在许多系统中,它们有一些开放式 url,不需要身份验证令牌或 API 密钥进行授权。这些 API 中的大多数都很关键。例如; 注册、登录和忘记密码 API 通常是开放的(即不需要验证身份验证令牌)。我们需要确保服务不被滥用。如前所述,我只是将我的发现放在这里,同时研究如何有效地防止暴力攻击。

这篇文章已经讨论了大多数常见的预防技术。我想补充一下我对帐户锁定和 IP 地址锁定的担忧。我认为锁定帐户作为一种预防技术是个坏主意。我在这里提出一些观点来支持我的事业。

帐户锁定不好

  • 攻击者可以通过锁定大量帐户来导致拒绝服务 (DoS)。
  • 因为您无法锁定不存在的帐户,所以只有有效的帐户名称才会锁定。攻击者可以利用这一事实从站点中获取用户名,具体取决于错误响应。
  • 攻击者可以通过锁定许多帐户并用支持电话淹没帮助台来引起转移。
  • 攻击者可以连续锁定同一个帐户,甚至在管理员解锁它几秒钟后,有效地禁用该帐户。
  • 帐户锁定对每小时只尝试几个密码的慢速攻击无效。
  • 帐户锁定对于针对大量用户名尝试使用一个密码的攻击无效。
  • 如果攻击者使用用户名/密码组合列表并在前几次尝试中正确猜测,则帐户锁定无效。
  • 管理员帐户等功能强大的帐户通常会绕过锁定策略,但这些帐户是最容易受到攻击的帐户。某些系统仅在基于网络的登录时锁定管理员帐户。
  • 即使您锁定了一个帐户,攻击仍可能继续,消耗宝贵的人力和计算机资源。
  • 例如,考虑一个拍卖网站,在该网站上,有几个竞标者为同一件物品而战。如果拍卖网站强制执行帐户锁定,一个投标人可以简单地在拍卖的最后一分钟锁定其他人的帐户,阻止他们提交任何中标的投标。攻击者可以使用相同的技术来阻止关键的金融交易或电子邮件通信。

帐户的 IP 地址锁定也是一个坏主意

另一种解决方案是锁定多次登录失败的 IP 地址。此解决方案的问题在于,您可能会通过阻止 ISP 或大公司使用的代理服务器来无意中阻止大量用户。另一个问题是,许多工具使用代理列表,并且只从每个 IP 地址发送几个请求,然后再继续下一个。在http://tools.rosinstrument.com/proxy/等网站上使用广泛可用的开放代理列表,攻击者可以轻松绕过任何 IP 阻止机制。由于大多数网站在密码失败后不会阻止,因此攻击者可以对每个代理进行两次或三次尝试。拥有 1,000 个代理列表的攻击者可以尝试 2,000 或 3,000 个密码而不会被阻止。尽管如此,尽管这种方法存在弱点,但遭受大量攻击的网站,尤其是成人网站,确实会选择阻止代理 IP 地址。

我的提议

  • 不锁定帐户。相反,我们可能会考虑在登录/注册尝试中为连续的错误尝试添加来自服务器端的故意延迟。
  • 在登录尝试中基于 IP 地址跟踪用户位置,这是 Google 和 Facebook 使用的常用技术。Google 发送 OTP,而 Facebook 提供其他安全挑战,例如从照片中检测用户的朋友。
  • Google re-captcha 用于 Web 应用程序,SafetyNet 用于 Android 和适当的 iOS 移动应用程序证明技术 - 在登录或注册请求中。
  • 设备 cookie
  • 构建 API 调用监控系统以检测对某个 API 端点的异常调用。

命题解释

故意延迟响应

密码验证延迟显着减慢了攻击者的速度,因为攻击的成功取决于时间。一个简单的解决方案是在检查密码时注入随机暂停。在大多数合法用户登录其帐户时,即使添加几秒钟的暂停也不会打扰他们。

请注意,虽然添加延迟可能会减慢单线程攻击,但如果攻击者同时发送多个身份验证请求,则效果会降低。

安全挑战

这种技术可以被描述为基于用户在早期使用系统时执行的操作的自适应安全挑战。如果是新用户,此技术可能会引发默认的安全挑战。

我们可能会考虑在何时提出安全挑战?有几点我们可以做到。

  • 当用户尝试从他以前不在附近的位置登录时。
  • 错误的登录尝试。

用户可能面临什么样的安全挑战?

  • 如果用户设置了安全问题,我们可能会考虑询问用户这些问题的答案。
  • 对于 Whatsapp、Viber 等应用程序,我们可能会考虑从电话簿中获取一些随机联系人姓名,并要求输入他们的号码,反之亦然。
  • 对于交易系统,我们可能会考虑向用户询问最新的交易和付款。

API监控面板

为 API 调用构建监控面板。

  • 在 API 监控面板中查找可能表明暴力攻击或其他帐户滥用的情况。
  • 从同一 IP 地址多次登录失败。
  • 使用来自同一 IP 地址的多个用户名登录。
  • 来自许多不同 IP 地址的单个帐户的登录。
  • 一次使用造成的过度使用和带宽消耗。
  • 使用按字母顺序排列的用户名或密码登录尝试失败。
  • 使用黑客常用的可疑密码登录,如 ownsyou (ownzyou)、washere (wazhere)、zealots、hacksyou 等。

对于内部系统帐户,我们可能会考虑只允许从某些 IP 地址登录。如果需要锁定帐户,而不是完全锁定帐户,请将其置于功能有限的锁定模式。

这里有一些不错的读物。

于 2018-05-21T22:11:07.523 回答
2

您可以添加某种形式的验证码测试。但请注意,它们中的大多数会使眼睛或听力受损的人更难接触。一种有趣的验证码形式是问一个问题,

2和2之和是多少?

如果你记录了最后一次登录失败,如果验证码足够老,你可以跳过验证码。如果最后一次失败是在最后 10 分钟内,则仅进行 CAPTCHA 测试。

于 2009-01-08T13:42:31.667 回答
2

我在线登录的许多在线留言板都让我尝试登录帐户 5 次,在这 5 次尝试之后,帐户被锁定一小时或十五分钟。它可能不漂亮,但这肯定会减慢对一个帐户的字典攻击。现在没有什么可以阻止同时针对多个帐户的字典攻击。即尝试5次,切换到另一个帐户,再尝试5次,然后圈回来。但它确实会减慢攻击速度。

对字典攻击的最佳防御是确保密码不在字典中!!!基本上设置某种密码策略,根据字母检查字典并要求密码中包含数字或符号。这可能是对字典攻击的最佳防御。

于 2009-01-08T13:43:25.957 回答
0

对于 .NET 环境

动态 IP 限制

IIS 的动态 IP 限制扩展为 IT 专业人员和主机提供了一个可配置的模块,该模块通过临时阻止遵循以下模式的 HTTP 客户端的 Internet 协议 (IP) 地址来帮助减轻或阻止拒绝服务攻击或通过暴力破解密码有利于其中一种攻击。可以配置此模块,以便可以在 Web 服务器或网站级别进行分析和阻止。

通过动态阻止来自恶意 IP 地址的请求来减少拒绝服务攻击的机会

IIS 的动态 IP 限制允许您通过检查请求的源 IP 并识别可能发出攻击信号的模式来降低 Web 服务器遭受拒绝服务攻击的可能性。当检测到攻击模式时,模块会将有问题的 IP 放入临时拒绝列表中,并在预定时间内避免响应请求。

将暴力破解您的 Web 服务器密码的可能性降至最低

IIS 的动态 IP 限制能够检测指示尝试解码 Web 服务器密码的请求模式。该模块会将有问题的 IP 放置在预定时间内被拒绝访问的服务器列表中。在针对 Active Directory 服务 (ADS) 进行身份验证的情况下,该模块能够通过避免向 ADS 发出身份验证质询来维持 Web 服务器的可用性。

特征

  • 无缝集成到 IIS 7.0 管理器中。

  • 根据以下任一条件动态阻止来自 IP 地址的请求:

    • 并发请求数。

    • 一段时间内的请求数。

  • 支持允许绕过动态 IP 限制过滤的 IP 列表。

  • 请求的阻止可以在网站或 Web 服务器级别进行配置。

  • 可配置的拒绝操作允许 IT 管理员指定将返回给客户端的响应。模块支持返回状态码 403、404 或关闭连接。

  • 支持 IPv6 地址。

  • 支持可能修改客户端 IP 地址的代理或防火墙后面的 Web 服务器。

http://www.iis.net/download/DynamicIPRestrictions

于 2012-05-22T19:32:53.300 回答
0

旧帖子,但让我在 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),“再次”打开它以“再次”看到我们的登录页面。

有帮助吗?

于 2016-12-22T06:25:37.147 回答
0

有几个方面需要考虑以防止暴力破解。考虑给定的方面。

  1. 密码强度

    强制用户创建密码以满足特定条件

    • 密码应至少包含一个大写、小写、数字和符号(特殊字符)。
    • 密码应具有根据您的标准定义的最小长度。
    • 密码不应包含用户名或公共用户 ID。

    通过创建最小密码强度策略,暴力破解将花费时间来猜测密码。同时,您的应用程序可以识别并迁移它。

  2. 重新验证码

    您可以使用 reCaptcha 来防止机器人脚本具有暴力破解功能。在 Web 应用程序中实现 reCaptcha 相当容易。您可以使用Google reCaptcha。它有多种 reCaptcha 风格,例如 Invisible reCaptcha 和 reCaptcha v3。

  3. 动态 IP 过滤策略

    如果该模式与攻击向量标准匹配,您可以动态识别请求模式并阻止 IP。过滤登录尝试的最流行的技术之一是Throttling. 阅读使用 php 的节流技术以了解更多信息。良好的动态 IP 过滤策略还可以保护您免受DoSDDos. 但是,这无助于预防DRDos

  4. CSRF 预防机制

    csrf称为cross-site request forgery。表示其他站点正在您的 PHP 脚本/控制器上提交表单。Laravel有一个非常明确的方法来防止csrf. 但是,如果您不使用这样的框架,则必须设计自己的JWT基于 csrf 的预防机制。如果您的网站受 CSRF 保护,则没有机会对您网站上的任何表单进行暴力破解。就像你关闭的大门一样。

于 2019-07-26T11:50:26.837 回答