我最近发现我的PM系统存在一个巨大的安全问题,它允许用户通过地址栏中的for
循环尽可能多地发送消息。有人把它放到地址栏中:
javascript:for(x=0;x<10000;x++){ $('#compose form').submit(); }
并且消息被发送了1000次给我,我的收件箱中充满了相同的消息,我的数据库非常充实,以至于phpMyAdmin非常迟钝。
我的问题是,我该如何防止这种情况?这是主要问题。
此外,表格是用AJAX提交的。
修改
我使用PHP,那么如何防止这种情况呢?就像我怎样才能将消息发送到每5分钟左右发送一次的消息,如果他们在5分钟内提交了多个消息,则会显示错误(或者根本不显示任何用户反馈,只是停止提交)?
答案 0 :(得分:3)
有一种明显的解决方法,问题不在于客户端 - 它位于服务器端。
您的服务器脚本不应允许过于频繁地发送邮件 - 例如。通常比每10分钟一次。为此,您可以在服务器端使用会话机制,并在用户发送电子邮件时保存信息。如果用户尚未发送电子邮件,您还应该将该信息保存在会话中 - 以区分启用了会话的人与禁用会话的人(并且您应该阻止后者发送电子邮件)。
应该实现会话的方式(具体代码)取决于您用于服务器端脚本的语言(PHP,Python,JSP等)。
答案 1 :(得分:2)
如果有人知道这样做,你可能无法在客户端做任何事情,所以我唯一的选择就是你记录或保留请求数量的计数等(也许是特定的资源)并拒绝特定用户的请求(或发送“忙”的http代码等)。
我认为最简单的方法是计算来自特定IP地址的请求(这显然有缺点,例如代理或NAT后面的多个用户等)。
实际的解决方案将取决于您的服务器端语言和Web服务器,但您可以构建规则并查看其工作原理。每个IP地址每分钟5个请求(或适合您的使用)。
答案 2 :(得分:2)
正如其他人所说,你必须在服务器上实现保护。没有多少客户端编码可以提供保护。
保护服务器免受此类滥用的常见方法称为rate limiting
。您可以决定希望给定客户端能够提交消息的频率,并对服务器进行编码以忽略超出该限制的任何消息。
例如,您可以决定每分钟只允许一条消息,每10分钟不超过两条消息,每小时不超过四条消息。你选择你认为合理的任何东西,并编码该算法。
在您的服务器中,您必须能够识别该消息来自哪个用户(很可能是通过身份验证cookie),并且在您的数据库中,您必须能够找到最后一条消息的时间是由该用户发送的。您甚至可以将该信息缓存在服务器的RAM中(取决于服务器的工作方式),以避免每次请求都进行数据库查找,因为您只需要保留最近的信息,而您只需要对重复违规者进行性能优化(那些试图滥用你的服务器,因此最近发送了一个请求的人。)
答案 3 :(得分:1)
我同意大家发布的关于限速的内容。
但是,在服务器端实现这一点非常复杂。特别是当你开始扩展时。而且,老实说,如果1000条消息伤害了你那么糟糕 - 我的建议可能更适用于你。
您可能希望查看第三方服务,而不是自己实现此功能,例如这个超酷的网络服务代理Apigee
他们的一个特点是,特别是API速率限制。 (见链接)