保护 php 脚本免受 csrf...没有 php 会话(跨站点)

protect php script against csrf...without php session (cross site)

我有一个 public 表单,可以将 POST 数据发布到 PHP 脚本。

此表单不在同一域中,也不使用 PHP,因此无法围绕 PHP 会话建立保护。

目标是允许此表单在那个PHP脚本上post。

How do I provide more security for checking source of the request 讲述了如何使用 PHP 会话实现 CSRF 保护,但我想知道没有它我该如何保护我的?可能吗?

与 GET 请求相比,

POST 请求更难伪造,因此您可以做到这一点,这很好。只要确保您没有在脚本中使用 $_REQUEST。

您不能在此处使用会话,但原则是相同的 - 您必须在表单和 PHP 脚本之间实施某种 "handshake"。如果会话不是一个选项,有几种不同的方法。

最简单的做法是检查 http 引荐来源网址。如果表单在 http 上,脚本在 https 下,这将不起作用,也可以使用开放重定向漏洞来克服。

另一种方法是验证码。我知道,现在用户不友好也不流行,但这会使请求伪造变得更加困难,因为黑客无法在没有任何用户输入的情况下在幕后进行他的攻击。您应该查看 reCAPTCHA(google 的 "I am not a robot" 复选框):https://www.google.com/recaptcha/intro/index.html

这是一个棘手的情况,因为一台主机上的表单和另一台主机上的脚本基本上本身就是 CSRF,因此您想要允许它但仅针对一台主机。在这里,没有任何用户交互的完全安全可能是不可能的,所以只要尽量让潜在的黑客很难搞砸你的脚本,或者在用户体验方面受到影响。我个人会选择 reCAPTCHA。