让我们假设你有一个网站,其中包含一个按钮。
当这个按钮被按下时,一个Ajax请求被发送到服务器 - 谁在它的数据库上的内部计数器接收请求,并增加了1。
一个用户可以复制整个请求(和它的头),并创建一个脚本来发送无限请求到服务器超载(和乱用计数器)。
我试图避免的情况:
- 记录用户IP
- 使用验证码
我用我的后端PHP。 有什么办法防止这种情况? 是否有某种方式来发送一个“看不见”的要求吗?
让我们假设你有一个网站,其中包含一个按钮。
当这个按钮被按下时,一个Ajax请求被发送到服务器 - 谁在它的数据库上的内部计数器接收请求,并增加了1。
一个用户可以复制整个请求(和它的头),并创建一个脚本来发送无限请求到服务器超载(和乱用计数器)。
我试图避免的情况:
我用我的后端PHP。 有什么办法防止这种情况? 是否有某种方式来发送一个“看不见”的要求吗?
你的问题被称为“跨站点请求伪造”。
解决这个问题的一个好方法是生成一个随机字符串时,上面有按钮的页面被调用,它写入到用户会话,并在生成的网页,并与您共同按下按钮的GET发送(例如请求)。
在后端方面,你是否提交的字符串在用户会话中的字符串相匹配,然后删除该会话的字符串。 只有当两个字符串匹配,并且不为空继续。
这样,每个请求的URL是唯一有效的一次,仅适用于谁最初与它的按钮打开页面的用户。
你可以创建一个独特的标记分配到按钮,只能通过按下按钮提交一次。
这将意味着用户需要刷新页面以获取一个新的按钮,如果那是一个问题,令牌与用户和按钮没有关联
上述方法意味着你需要添加服务器端代码。 你也许可以用类似脱身evercookie登录的客户方按下按钮并试图阻止用户发送另一个请求和recieving来自用户的另一个要求-我不建议在督促这样做,但它可能会很有趣;)
生病尽量多一点明确:
生成的按钮,以便将其提交含有隐藏字段称为“UUID”,其中包含该按钮的预先生成的UUID的形式。 此UUID将需要保存在数据库中或在内存中。 如果你使用一个很好的UUID lib下,用户生成的现有UUID的可能性是极小的。
现在,用户点击该按钮和动作去/我的按钮/?UUID = 3394b0e0-a3bb-11e1的-b3dd-0800200c9a66
现在所述服务器检查是否UUID是先前产生的一个。 如果是,它会删除其存储位置的uuid并让动作做什么。 该UUID不存在,它返回一个404。
你不可能知道的请求是如何发起的,所有你能做的就是使它更难以伪造。 但是,如果这是值得做的安全性,那么它是谁能够成功伪造的要求,即你需要最清楚的人。 所以,很可能没用(甚至是误导的),试图以此为某种安全措施。
你可以尝试加密密钥服务器将在一段时间内lmit接受一次,但你还是不会知道请求是如何发起的(你真的不应该依赖于这一点)。 按钮的UI功能,可能被转换成基于任何用户代理已被配置为向用户呈现(如果在所有invovled的用户)的一些其他UI工件。