0

I need to make sure a request comes from a user submitting a form on the website rather than an automated POST request.

I could use

  • HTTP_REFERRER - but this is not reliable
  • hidden input field with random value from session - but what's to stop a spammer from going to my form, getting the value from the hidden field, and pasting it into his "program" as part of his automated request?

Any other options?

4

2 回答 2

0

恐怕没有办法:如果你检查你的选项#2

来自会话的具有随机值的隐藏输入字段 - 但是如何阻止垃圾邮件发送者进入我的表单,从隐藏字段中获取值,并将其粘贴到他的“程序”中作为他的自动请求的一部分?

您所描述的正是浏览器所做的。它会“转到您的表单”、“从隐藏字段中获取值”,然后将其提交到您的服务器。

而且您无法区分两个相同的操作方式

您可以通过多种方式使垃圾邮件发送者的生活变得困难。

例如,隐藏字段可能由 Javascript 片段填充;所有非 JS 浏览器(以及所有禁用 JS 的客户)都将被退回。

您可能需要对初学者进行会话身份验证;这样,您以后就可以通过拉取他的帐户来阻止垃圾邮件发送者。

只是为了搞笑(我不建议这样做——笨重、有风险、容易出错,你会树敌),你可以采用心理策略:在成功的情况下你的系统应该给出什么响应(例如垃圾邮件变得可见) ),您也可以在失败的情况下提供,但只能针对引起响应的同一 IP 地址,并且只能持续五分钟。大多数自动垃圾邮件工具甚至都不会检查;大多数人类“垃圾邮件调谐器”一旦看到他们的垃圾邮件出现就会感到满意,并继续对他们的下一个受害者轻笑。如果他们稍后检查,他们的机器人似乎仍然可以工作。如果运气好的话,他们会相信有一个人类网站管理员在精神上寻找并取消他们的垃圾邮件,然后他们会再次继续前进。

于 2012-10-20T19:10:33.447 回答
0

您可以使用 HMAC 方法,使用散列算法对 POST 有效负载的前几位进行散列,该散列算法由仅在您的 php 库和后端之间已知的密钥保护。将计算的哈希存储在 http 标头中,而不是作为表单有效负载的一部分。然后,您需要做的就是通过使用密钥计算哈希值来验证服务器端提交的数据,如果哈希值未检出,您就知道这是一个虚假提交。有关详细信息,请参阅

此外,基本的 cookie 安全参数,例如HttpOnly指示浏览器不允许通过传输中的脚本(VBScript、JavaScript 等)访问您设置的 cookie,因此您的令牌在传输中可能会更安全一些。

于 2012-10-21T08:02:08.943 回答