4

我寻求一种方法来验证一组帖子变量的发件人是我认可的发件人。

我在服务器 A 上托管了一个简单的 HTML 表单。此表单的操作指向服务器 B,我在其中处理数据。我想要的是一种方法来确保数据实际上是从服务器 A 而不是随机服务器 C 发送的。有没有方便的方法来做到这一点?

我看过一些不同的方法,我觉得没有一个是好的:

  • HTTP_REFERER$_SERVER. 根据php.net,这不能真正被信任 。

  • 保留会话变量(让会话 ID 从 A 转移到 B 并将它们附加到查询字符串)。这感觉不对。

  • 在表单中添加 a<input type="hidden" name="secretkey" />并在接收端检查该键。这将只需要查看 html 源代码即可获取“密钥”。

4

1 回答 1

5

简短的回答:您的表单,我们称之为 X,需要发回给 A。然后 A 可以签署请求,然后将所有这些转发给 B。

如果您不回发给 A,那么 B 如何知道请求来自 A?A 不知道客户(我们称之为 Zed)要发送什么?A 仅将表单 X 发送给 Zed,否则不再参与对话。

Zed,可以在 X 中发布任何他们想要返回给 A 的内容。Zed 可能是恶意的,或者 Zed 可能是 CSRF 的受害者。但是,您的问题只是 B 知道请求来自 A。A 可以验证输入并采取适当的措施。如果 A 选择接受输入表单 X 并签署请求并发送给 B,则 B 将知道该请求来自 A。

这个想法类似于OAuth 1.0a所做的。

获取 X 中的所有表单变量,并使用按字母数字排序的键创建一个 URL 编码字符串。

$str = "keyA=<val1>&keyB=<val2>&keyB123=<val3>";

然后散列并签名。HMAC-SHA1曾经是这样的算法来做到这一点。对于密钥,您需要生成一些随机的字符串和数字。A 和 B 都应该知道这个值,你应该把它保密。然后,您可以生成签名以添加到您对 B 的请求中。

$signature = hash_hmac("sha1", $str, $key);

B 可以通过执行与创建原始表单相同的步骤来验证表单 X 的签名$str

于 2013-08-07T00:01:04.737 回答