Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/php/232.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/.htaccess/6.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Php 如何防止表单在5分钟内提交多次?_Php_Javascript Injection_Address Bar - Fatal编程技术网

Php 如何防止表单在5分钟内提交多次?

Php 如何防止表单在5分钟内提交多次?,php,javascript-injection,address-bar,Php,Javascript Injection,Address Bar,我最近发现我的PM系统存在一个巨大的安全问题,它允许用户通过地址栏中的for循环发送任意数量的消息。有人把这个放进地址栏: javascript:for(x=0;x<10000;x++){ $('#compose form').submit(); } javascript:for(x=0;x如果有人知道要对您执行此操作,您可能无法在客户端执行任何操作,因此我要说的唯一选项是,您记录或保留请求数等(可能是对特定资源的请求),并拒绝特定用户的请求(或发送“忙碌”的http代码等) 我认为最简

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

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

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

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


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

有一种明显的方法可以解决它,问题不在客户端-而在服务器端

您的服务器脚本不应允许发送消息的频率太高-例如,每10分钟发送一次。要做到这一点,您可以在服务器端使用会话机制,并在用户发送电子邮件时保存信息。如果用户尚未发送电子邮件,您还应在会话中保存该信息-以进行distin从会话被禁用的人(您应该阻止会话被禁用的人发送电子邮件)中屏蔽会话被启用的人


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

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

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

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


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

我同意大家关于速率限制的说法

然而,在服务器端实现这一点可能非常复杂。特别是当您开始向外扩展时。而且,老实说,如果1000条消息对您造成如此严重的伤害,我的建议可能会对您更适用

您可能不想自己实现它,而是想寻找第三方服务来为您实现它,比如这个超级酷的web服务代理

它们的一个特性就是API速率限制(参见链接)


你不能用客户端代码来解决这个问题。它必须在服务器上完成。你不能控制浏览器中发生的事情;如果你想防止这一点,你需要在服务器端做它。考虑用一个问题来代替它。删除我的答案……你都是正确的,所有的验证都应该在客户端和服务器端完成。您需要使用您使用的相关服务器技术重新标记您的问题,以便找到合适的服务器端解决方案。@Nathan,如果非要我猜的话,我会说他们否决了您最初提出的问题,并且没有回来再看一看。不幸的是,如果您收到问题/帖子,StackOverflow不会给您任何通知downvoted后来被编辑。每十分钟一封的限制似乎过于严格。服务器处理可能会将重复邮件限制为每五分钟一封,而将唯一邮件限制为每分钟一封,或者类似的内容。@nnnnnn:这取决于我们谈论的是什么网站。如果这是个人网站每天点击数十次和一张联系表,那么我认为10分钟并不是太严格。这实际上取决于单个用户是否需要在几分钟内发送多封电子邮件。还有一个问题:OP可以接受的电子邮件接收频率是多少(如果这是每小时100封电子邮件,因为它们是在员工之间发送的,那么限制不应该像我建议的那样严格)。同时认为,发送大量独特的电子邮件并不困难。最好将限制改为每小时发送不超过x封邮件,而不是根据单个邮件之间的最短时间进行限制。这将在不给“正常”合法用户带来不便的情况下解决问题。OP提到了他的“PM系统”,所以我假设他说的是某种论坛/讨论类型的网站,普通用户可以合理地期望在十分钟内发送十几条或更多的短信,但不能合理地期望连续发送几个小时。@nnnnnn:关于PM系统的观点很好,我错过了。无论如何,我最初建议每10分钟发送一条答案,所以它应该被视为时间段,而不是发送的消息之间的差异(实际上,因为使用cronjobs清除此类数据会更容易)。但我认为它不会“解决问题而不给“正常”合法用户带来不便”-他们必须将其视为“正常”