除了HTTP_REFERER和使用nonce之外,如何确保从我的网站表单发送POST数据?

时间:2012-10-20 18:55:09

标签: php forms session post security

我需要确保请求来自用户在网站上提交表单而不是自动POST请求。

我可以用

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

还有其他选择吗?

2 个答案:

答案 0 :(得分:0)

我担心没有办法:如果你检查你的选项号#2

  

隐藏的输入字段,其中包含来自会话的随机值 - 但是要停止的是什么   垃圾邮件发送者转到我的表单,从隐藏中获取值   字段,并将其粘贴到他的“程序”中作为其自动化的一部分   请求?

您所描述的确切地说是浏览器会做什么。它将“转到您的表单”,“从隐藏字段中获取值”,并将其提交给您的服务器。

你无法区分两个相同的 modi operandi

您可以通过多种方式为垃圾邮件发送者制造难题。

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

您可能需要为初学者提供会话身份验证;这样你就可以通过拉他的帐户来阻止垃圾邮件发送者。

只是为了笑(我不建议这样做 - 笨重,冒险,容易出错,你做坏事),你可以采用心理策略:你的系统应该给出的任何回应如果成功(例如spampost变得可见),你也可以在发生故障的情况下给出,但只能提供引发响应的同一IP地址,并且只能持续五分钟。大多数自动垃圾邮件工具甚至不会检查;一旦他们看到垃圾邮件出现,大多数人类“spambot调谐器”都会满意,并继续向他们的下一个受害者轻笑。如果他们稍后检查,他们的机器人仍然出现工作。有了一点运气,他们会相信有一个人类网站管理员在精神上狩猎和取消他们的垃圾邮件,他们将继续前进。

答案 1 :(得分:0)

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

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