在php中验证HTTP post发件人

时间:2013-08-06 23:37:17

标签: php html

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

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

我看过一些不同的方法,没有一种我认为是好的方法:

    HTTP_REFERER
  • $_SERVER。这根本不可信 php.net

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

  • 在表单中添加<input type="hidden" name="secretkey" />并在接收端检查该密钥。这只需要在html源处的视图来获取“密钥”。

1 个答案:

答案 0 :(得分:5)

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

如果你不回帖给A,那么B怎么知道请求来自A? A不知道我们称之为Zed的客户会发送什么?仅向Xed发送表单X,否则不再参与对话。

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 is once such algorithm这样做。对于密钥,您需要生成一些随机字符和数字字符串。 A和B都应该知道这个值,你应该保持非常私密。然后,您可以生成签名以添加到您对B的请求中。

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

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