PHP - 如何确定请求是否来自特定文件

时间:2010-02-21 05:14:53

标签: php security server-variables

我在SERVER_B上有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“;它并不那么安全。

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

7 个答案:

答案 0 :(得分:4)

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

答案 1 :(得分:2)

不可能,因为你的陈述:

"since someone can go into fileB.php"

答案 2 :(得分: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();
}

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

答案 3 :(得分:0)

一旦您在服务器外请求,您实际上无法控制。如果另一台服务器上的fileA有可能使用中等文件B,则需要重新考虑您的安全模型。具体情况是什么?

答案 4 :(得分:0)

一种方法是检查

$_SERVER['HTTP_REFERER']
PHP中的

变量,但是浏览器决定填充它,因此无法完全信任它。

答案 5 :(得分:0)

如果第三方有权访问fileB.php,则可以做的很少。 REFERER为您提供无保护。 REMOTE_ADDR并不像欺骗那样微不足道,这可能会让您确信请求是合法的。

答案 6 :(得分:0)

我认为nickf是现货,但只是为了扩展他的答案,这就是我要做的事情:

    Server1上的
  • fileB.php请求Server2上的fileC.php
  • Server上的
  • fileC.php返回一个随机生成的salt,将其存储在带有时间戳的文件或数据库中
  • 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删除生成的最后一个盐。