一种可能性是考虑使用客户谜题。基本思想是在您接受用户名/密码对并尝试验证之前,强制客户端做大量工作,并证明它已经这样做了。
以下是该方法的概述。服务器生成一个随机拼图,并将拼图发送给客户端。服务器生成谜题的方式可以合理地预测解决谜题需要多少努力(例如,100 毫秒的计算)。客户端解决难题,然后将解决方案与用户的用户名和密码一起发送。
在网络设置中,这可能会使用 Javascript 实现:登录页面将包含用于解决难题的 Javascript 代码和难题描述。合法用户的网络浏览器将在页面上运行 Javascript,这将解决难题并将解决方案与用户名和密码一起包含在表单中。
这使得攻击者更难对服务器进行 DOS 操作。例如,如果服务器需要 100 毫秒的计算时间来检查用户密码的有效性,并且如果服务器选择一个需要 100 毫秒来解决的谜题,那么攻击者至少需要做与服务器一样多的工作。如果你转动拨盘来选择需要 200 毫秒才能解决的谜题,那么现在攻击者必须做两倍于你的工作才能对你进行 DOS。因此,这并不能阻止 DOS,但它会使它变得更加困难,并且需要攻击者投入更多资源——这可能会在一定程度上降低风险。
这是一个非常简单的示例,说明如何构建拼图。拼图的描述是一个随机的 128 位数字R(由服务器选择,并发送给客户端)。目标是找到一个数字n,使得 SHA256( R , n ) 在其低 20 位为零。客户端可以遍历 n 的值(测试n = 0 是否为解决方案,测试n = 1 是否为解决方案,测试n = 2 是否为解决方案,...)直到客户端找到解决方案。平均而言,您应该预计这需要大约 2 20 次试验。如果客户端每秒可以执行大约一千万次哈希,那么 2 20试验大约需要十分之一秒(100 毫秒)。一旦客户端找到解决方案,客户端就可以将n发送到服务器。请注意,服务器可以快速验证n是该难题的有效解决方案(它只需要一个哈希,而不是一百万个哈希)。这创建了所需的不对称性,服务器可以非常快速地生成新的谜题并验证声称的谜题解决方案,但解决谜题需要更长的时间,并且服务器可以以相当准确的程度控制解谜所需的时间。这只是拼图结构的一个例子;对这个问题进行了大量的研究,并且有更好的 构造。
你可能对kaPoW特别感兴趣,它为 web 上下文实现了这个想法。
主要限制是这对于专门的攻击是不安全的。一个严重的攻击者只需获得一个由几百台机器组成的僵尸网络(这并不昂贵),然后对你进行 DOS 攻击,现在你完全被淹没了。客户端谜题无法阻止这种攻击:它们只能阻止相对低级的攻击。然而,停止 DOS 通常是非常困难的。
第二个限制与可能访问您网站的客户的计算能力的广泛可变性有关。高端台式机可以在 100 毫秒内解决的难题可能需要移动设备 1000 毫秒才能解决(我在这里编数字)。如果您选择的参数可以在可能访问您网站的最低功耗设备上相对容易地解决这个难题,那么您可能会发现针对高端台式机的安全性会降低。此外,C 程序(由攻击者运行)可能比 Javascript(由合法用户运行)更快地解决难题似乎是合理的,这将进一步加剧攻击者解决难题的速度与解决难题的速度之间的差距。最慢的合法客户端可以多快解决它们。这种差距会降低安全性。
第三个限制是客户端谜题需要客户端使用 Javascript 才能登录。但是这可能是可以接受的。
这个想法的一个变种是让服务器监控自己并检查它是否处于高负载状态。在正常情况下,跳过拼图。但是,如果服务器似乎受到 DOS 攻击,则开始要求登录尝试以提供谜题解决方案。这减轻了客户端谜题方法的一些缺点,但仍远非完美,并且仍然无法承受严重的 DOS 攻击。
我描述了这个潜在的解决方案,以防你感兴趣,但我并不真的推荐它用于大多数网站。对于大多数网站来说,DOS的风险都比较低,如果确实发生了,你可以在当时进行处理。出于这个原因,我的猜测是,实施这些防御措施可能不值得您花费时间或精力。如果您有那么多额外的时间和精力可以腾出,您最好将其用于构建新功能或使您的网站更好。