2

我在 SERVER_A 上有 fileA.php,在 SERVER_B 上有 fileB.php

fileB.php 向 fileA.php 发出 curl 请求以获取其内容

fileA.php 如何确定请求是专门来自 fileB.php 的?

--

我正在考虑将 fileB.php 中的 $_SERVER['SCRIPT_NAME'] 发送到 fileA.php 但是因为有人可以进入 fileB.php 或任何一般文件,只需执行 $_SERVER['SCRIPT_NAME'] = 'fileB.php '; 它并不是那么安全。

那么,出于安全原因,我如何确定请求来自不同服务器上的特定文件?

4

7 回答 7

4

你不能,可靠。您可以尝试设置 HTTP 标头并在另一端进行验证;它不是万无一失的,但它比大多数都好。

于 2010-02-21T05:23:13.877 回答
2

为什么不设置一个秘密令牌,并在接收端进行验证呢?

// fileB.php

$url = "http://example.com/fileA.php"
     . "?from=fileB"
     . "&token=" . sha1('fileB' . 'myaw3som3_salt!')
;
// then make the cURL request.


// fileA.php
if (sha1($_GET['from'] . 'myaw3som3_salt!') != $_GET['token']) {
    die();
}

这是一个简单的例子,但你明白了。

于 2010-04-15T08:49:11.627 回答
2

不可能,因为您的陈述:

"since someone can go into fileB.php"
于 2010-04-15T08:41:03.930 回答
0

我认为 nickf 是正确的,但只是为了稍微扩展他的答案,这就是我要做的:

  • Server1 上的 fileB.php 请求 Server2 上的 fileC.php
  • Server2 上的 fileC.php 返回随机生成的盐,将其存储在带有时间戳的文件或数据库中
  • Server1 上的 fileB.php 请求 Server2 上的 fileA.php,并作为其请求正文发送一个预配置的密钥,经过散列、附加随机盐并再次散列(例如 sha1(sha1('mypassword') . $salt))
  • fileA.php 检查过去 60 秒内是否生成了盐,如果没有则返回错误
  • fileA.php 使用其最后一个随机盐和预配置的密钥执行相同的哈希 - sha1(sha1('mypassword') . $salt) 再次与 fileB.php 发送的请求正文进行比较。如果它们匹配,fileA.php 将授予对 fileB.php 的访问权限。
  • fileA.php 删除最后生成的盐。
于 2010-06-12T01:55:35.513 回答
0

一旦你在你的服务器之外请求,你就真的无法控制了。如果另一台服务器上的 fileA 可能存在中间人 fileB,您需要重新考虑您的安全模型。具体情况如何?

于 2010-02-21T05:22:02.600 回答
0

一种方法是检查

$_SERVER['HTTP_REFERER']

PHP 中的变量,但它是浏览器决定填充它,因此它不能被完全信任。

于 2010-02-21T05:23:04.690 回答
0

如果第 3 方有权访问 fileB.php,则几乎无能为力。REFERER 不给你任何保护。REMOTE_ADDR 对于欺骗来说并不是那么简单,这可能会让您确信请求是合法的。

于 2010-02-21T05:35:57.330 回答