假设您有一个包含单个按钮的网站。
当按下此按钮时,将向服务器发送一个 ajax 请求 - 服务器接收请求并在其数据库的内部计数器中添加 1。
用户可以复制整个请求(及其标头)并创建一个脚本来发送无限请求以使服务器过载(并弄乱计数器)。
我试图避免:
- 记录用户IP
- 使用验证码
我在后端使用 php。有什么办法可以防止这种情况发生吗?有什么方法可以发送“隐形”请求吗?
假设您有一个包含单个按钮的网站。
当按下此按钮时,将向服务器发送一个 ajax 请求 - 服务器接收请求并在其数据库的内部计数器中添加 1。
用户可以复制整个请求(及其标头)并创建一个脚本来发送无限请求以使服务器过载(并弄乱计数器)。
我试图避免:
我在后端使用 php。有什么办法可以防止这种情况发生吗?有什么方法可以发送“隐形”请求吗?
您的问题称为“跨站点请求伪造”。
解决此问题的一个好方法是在调用带有按钮的页面时生成一个随机字符串,将其写入用户会话和生成的页面,并与您的按钮按下一起发送(例如在 GET要求)。
在后端,您检查提交的字符串是否与用户会话中的字符串匹配,然后从会话中删除该字符串。仅当两个字符串匹配且不为空时才继续。
这样,每个请求 URL 仅有效一次,并且仅对最初打开带有按钮的页面的用户有效。
您可以创建一个分配给按钮的唯一令牌,并且只能在按下按钮时提交一次。
这意味着用户将需要刷新页面以获取新按钮,如果这是一个问题,请将令牌与用户而不是按钮相关联
上述方法意味着您需要添加服务器端代码。您可能可以使用evercookie之类的东西来记录客户端上的按钮按下并尝试阻止用户发送另一个请求并接收来自用户的另一个请求 - 我不建议在产品中这样做,但这可能很有趣;)
生病尝试更清楚一点:
生成按钮,以便它提交一个表单,其中包含一个名为“uuid”的隐藏字段,该字段包含该按钮的预生成 uuid。此 uuid 需要保存在数据库或内存中。如果您使用良好的 uuid 库,则用户生成现有 uuid 的机会微乎其微。
现在,用户单击按钮,操作转到 /my-button/?uuid=3394b0e0-a3bb-11e1-b3dd-0800200c9a66
现在服务器检查 uuid 是否是以前生成的。如果是,它会从其存储位置中删除 uuid,并让操作执行任何操作。uuid 不存在,它返回 404。
你不可能知道请求是如何发起的,你所能做的就是让它更难伪造。但是,如果这与安全有关,那么您最需要注意的是能够成功伪造请求的人。因此,尝试将其作为某种安全措施可能是无用的(甚至是误导性的)。
您可以尝试使用服务器仅在特定时间限制内接受一次的加密密钥,但您仍然不知道请求是如何发起的(而且您真的不应该依赖它)。按钮是一种 UI 功能,可以根据用户代理已配置为呈现给用户的任何内容(如果有用户参与)转换为其他一些 UI 工件。