我寻求一种方法来验证一组post变量的发送者是否是我认可的发送者。
我有一个简单的HTML表单托管在服务器A上。这个表单的操作指向服务器B,我在那里处理数据。我想要的是一种方法来确保数据实际上是从服务器A而不是某个随机服务器C发送的。有没有一种方便的方法来做到这一点?
我看了一些不同的方法,没有一种是我觉得好的:
HTTP_REFERER中的$_SERVER。根据
php.net
保留会话变量(将会话id从
,并将其附加到查询字符串中)。这感觉不对。
在表单中添加<input type="hidden" name="secretkey" />并在接收端检查该键。这只需要html源代码处的一个视图来获取“secretkey”。

最佳答案

简言之:你的表格,我们称之为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 is once such algorithm这样做。对于密钥,您需要生成一些随机的字符和数字字符串。A和B都应该知道这个值,你应该保密。然后您可以生成签名以添加到您对b的请求中。
$signature = hash_hmac("sha1", $str, $key);

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

09-19 00:36