每当我回到编写统计网络服务的代码时,我都需要动态生成图像和图表。生成的图像将取决于请求参数、数据存储库的状态和一些标头信息。
因此,如果我是你,我会编写一个REST网络服务来提供这些图像。这并不太困难。这也很有趣,因为如果您不喜欢特定的IP地址,您可以显示舌头卡在嘴边的卡通(或OBL桑巴舞蹈的动画GIF),而不是数据请求的图像。
对于您的情况,您会检查HTTP标头中的引用者(或referrer)吗?我表示怀疑,因为人们可以并且会隐藏、清空甚至伪造HTTP标头中的引用者字段。
因此,不仅要检查引用者字段,还要创建一个数据字段,其中值会发生变化。该值可以是简单的匹配值。
在第二次世界大战期间,罗斯福和丘吉尔通过加密进行通信。他们每个人都有一堆相同的磁盘,其中包含加密机制。每次交谈后,两人都会丢弃磁盘(并永远不会重复使用),以便下一次再次交谈时,他们会拿起堆栈上的下一个磁盘。
与其使用一堆磁盘,您的图像消费者和图像提供者将携带相同的32位令牌堆栈。32位将为您提供约4十亿个10分钟周期。该堆栈是随机排序的。由于众所周知,“随机生成器”并非真正随机,实际上在某种程度上是可以预测的算法,如果提供足够长的序列,您应该使用“真正的随机生成器”或每周重新排序堆栈。
由于延迟问题,您的提供者将接受来自当前期间、上一个期间和下一个期间的令牌。其中期=扇区。
您的ajax客户端(可能是gwt)在浏览器上每10分钟从服务器获取更新的令牌。ajax客户端将使用该令牌请求图像。您的图像提供程序服务将拒绝过时的令牌,您的ajax客户端必须从服务器请求新的令牌。
这不是一种防火方法,但它是防震的,因此可以减少/阻止垃圾邮件请求的数量(我认为几乎为零)。
我生成“真正随机”序列的方法是快速而简单的。我通过手动重新排序或删除序列的值,花费几分钟时间对算法生成的“随机”序列进行进一步处理。这会破坏任何算法的可预测性。也许你可以编写一个“扔扳手”的程序。但是,算法扔扳手只是在另一个可预测的算法之上添加了一个可预测的算法,这根本没有降低总体的可预测性。
你可以通过使用循环冗余匹配作为快速而简单的“加密”令牌匹配机制来进一步限制情况。
假设你有一个被分成8个等距扇区的圆。你需要一个3位二进制数来寻址这8个扇区中的任何一个。想象一下,每个扇区都被进一步细分为8个子扇区,现在你将能够用额外的3个字节寻址每个子扇区,总共6个字节。
您计划每10分钟更改匹配值。您的图像提供商和所有已批准的消费者将拥有相同的扇区地址堆栈。每十分钟,他们会丢弃扇区地址并使用下一个地址。当消费者向您的提供商发送匹配值时,它不会发送扇区地址,而是发送子扇区地址。因此,只要您的提供商接收到属于当前接受的扇区的子扇区地址,提供商服务就会响应正确的图像。
但是,子扇区地址通过混淆序列算法重新映射。因此,同一扇区内的每个子扇区地址看起来都不相似。这样,不是所有浏览器都会接收到相同的令牌值或高度相似的令牌值。
假设您有16位扇区地址,每个扇区都有16位子扇区地址,组成32位令牌。这意味着您可以拥有65536个并发浏览器客户端,携带相同的令牌扇区,但没有两个令牌具有相同的低可预测性值。因此,您可以为每个会话ID分配一个令牌子扇区值。除非您的图像提供程序服务有超过65536个并发会话,否则不需要共享相同的子扇区令牌地址。通过这种方式,除非垃圾邮件发送者可以访问会话ID伪造设备/设施,否则您的图像提供程序将不会被垃圾邮件攻击,除非是拒绝服务攻击。
低可预测性意味着窥探者或偷窥者很难编造出一个可接受的令牌来垃圾邮件攻击您的图像提供程序服务。
当然,普通机器人无法通过 - 除非您真的冒犯了ANONYMOUS组,并且他们决定纯粹出于乐趣而垃圾邮件攻击您的服务器。即使如此,如果您在扇区地址堆栈和子扇区映射中引入了障碍,预测下一个令牌将非常困难。
顺便说一句,循环冗余匹配实际上是一种纠错技术,而不是加密技术。