8

for我最近发现我的 PM 系统存在一个巨大的安全问题,它允许用户通过地址栏中的循环发送任意数量的消息。有人把这个放到地址栏中:

javascript:for(x=0;x<10000;x++){ $('#compose form').submit(); }

这条消息被发送了 1000 次,我的收件箱里满是同样的消息,而且我的数据库太满了,以至于 phpMyAdmin 非常滞后。

我的问题是,我怎样才能防止这种情况发生?这是一个重大问题。

此外,表单是使用 AJAX 提交的。

编辑:

我使用 PHP,那么我该如何防止这种情况呢?就像我怎样才能做到每 5 分钟左右只能发送一条消息,如果他们在 5 分钟内提交了多个消息,它将显示错误(或者根本不显示任何用户反馈并阻止它被提交)?

4

4 回答 4

3

有一种明显的解决方法,问题不在于客户端,而是在于服务器端

您的服务器脚本不应允许过于频繁地发送消息- 例如。通常比说,每 10 分钟一次。为此,您可以在服务器端使用会话机制并在用户发送电子邮件时保存信息。如果用户尚未发送电子邮件,您还应该将该信息保存在会话中 - 以区分启用会话的人和禁用会话的人(并且您应该完全阻止后者发送电子邮件)。

session 的实现方式(具体代码)取决于您用于服务器端脚本的语言(PHP、Python、JSP 等)。

于 2011-12-02T03:42:17.120 回答
2

如果有人知道对您执行此操作,您可能无法在客户端执行任何操作,因此我要说的唯一选择是您记录或保留请求数量的计数等(可能是特定资源)和拒绝特定用户的请求(或发送“忙碌”的 http 代码等)。

我认为最简单的方法是计算来自特定 IP 地址的请求(这显然有缺点,例如代理或 NAT 后面的多个用户等)。

实际的解决方案将取决于您的服务器端语言和 Web 服务器,但您也许可以制定一个规则并查看它是如何工作的。每个 IP 地址每分钟 5 个请求(或任何适合您使用的请求)。

于 2011-12-02T03:38:57.587 回答
2

正如其他人所说,您必须在服务器上实施保护。再多的客户端编码都无法提供保护。

保护服务器免受此类滥用的常用方法称为rate limiting. 您决定希望给定客户端能够提交消息的频率,并且您对服务器进行编码以忽略任何超出该限制的消息。

例如,您可以决定您将允许每分钟不超过一条消息,每 10 分钟不超过两条消息,每小时不超过四条消息。您选择您认为合理的任何内容,然后为该算法编写代码。

在您的服务器中,您必须能够识别消息来自哪个用户(很可能通过身份验证 cookie),并且在您的数据库中,您必须能够找出最后一条消息的发送时间那个用户。您甚至可以将该信息缓存在服务器的 RAM 中(取决于您的服务器的工作方式),以避免对每个请求进行数据库查找,因为您只需要保留最近的信息,并且只需要对屡犯者进行性能优化(那些试图滥用您的服务器并因此最近才发送请求的人)。

于 2011-12-02T03:42:42.720 回答
1

我同意每个人发布的关于速率限制的内容。

但是,这在服务器端实现起来可能非常复杂。尤其是当您开始向外扩展时。而且,老实说,如果 1000 条消息对您造成如此严重的伤害 - 我的建议可能更适用于您。

您可能希望寻找第三方服务来为您做这件事,而不是自己实现,例如这个超级酷的网络服务代理Apigee

具体来说,它们的功能之一是 API 速率限制。(见链接)

在此处输入图像描述

于 2011-12-02T03:47:44.033 回答