如何阻止用户伪造请求?或者如何检测虚假请求?

时间:2012-05-22 02:42:35

标签: php javascript ajax http request

假设您的网站包含一个按钮。

按下此按钮时,会向服务器发送ajax请求 - 该服务器接收请求并在其数据库的内部计数器中添加1。

用户可以复制整个请求(及其标题)并创建一个脚本来发送无限请求以使服务器过载(并使计数器混乱)。

我试图避免:

  1. 录制用户IP
  2. 使用Captcha
  3. 我在后端使用php。有没有办法防止这种情况?有没有办法发送“隐形”请求?

3 个答案:

答案 0 :(得分:2)

您可以创建分配给该按钮的唯一令牌,并且只能在按下按钮时提交一次。

这意味着用户需要刷新页面才能获得新按钮,如果有问题,请将令牌与用户关联,而不是按钮

上述方法意味着您需要添加服务器端代码。您可以通过使用类似evercookie的内容来记录客户端上的按钮按下并尝试阻止用户发送另一个请求并接收用户的其他请求 - 我不建议在prod中执行此操作,但是它可能很有趣;)


生病了,试着说得更清楚一点:

生成按钮,以便提交一个包含名为“uuid”的隐藏字段的表单,该字段包含该按钮的预生成uuid。这个uuid需要保存在数据库或内存中。如果你使用一个好的uuid lib,那么用户生成现有uuid的可能性是无穷小的。

现在,用户点击了按钮,操作进入/ my-button /?uuid = 3394b0e0-a3bb-11e1-b3dd-0800200c9a66

现在服务器检查uuid是否是以前生成的uuid。如果是,它会从存储的位置删除uuid并让动作做任何事情。如果uuid不存在,则返回404。

答案 1 :(得分:2)

您的问题称为“跨站点请求伪造”。

解决此问题的一个好方法是在调用带有按钮的页面时生成随机字符串,将其写入用户会话和生成的页面,并将其与按下按钮一起发送(例如在GET请求中。)

在后端,检查提交的字符串是否与用户会话中的字符串匹配,然后从会话中删除字符串。只有两个字符串匹配且不为空时才会继续。

这样每个请求URL只有一次有效,并且只对最初打开页面的用户有效。

答案 2 :(得分:0)

您无法知道请求是如何发起的,您所能做的就是让假冒更加困难。但是,如果这与安全性有关,那么可以成功伪造您需要最了解的请求的人。因此,尝试将其作为某种安全措施可能是无用的(甚至是误导性的)。

您可以尝试加密密钥,服务器只能在一定时间内接受一次,但您仍然不知道请求是如何启动的(并且您真的不应该依赖它)。按钮是一种UI功能,可以根据用户代理配置为用户呈现的内容(如果有用户进行了调用)转换为其他UI工件。