1

这是情况。

我有一个主 Web 服务器,它需要能够使用 PHP 访问远程 Web 服务器上的文件。我也有一个远程服务器。远程服务器上的文件是私有的。也就是说,我只想通过我在主服务器上的 PHP 脚本来访问它们。

如何只允许从主服务器访问文件目录,但拒绝其他任何人访问?

4

1 回答 1

4

在您的 .htaccess 文件中:

AuthName "Protected" 
AuthType Basic 
<Limit GET POST> 
order deny,allow 
deny from all 
allow from YOUR.SERVER.IP.ADDRESS 
</Limit> 

我就是这样做的。将其放在您要保护的目录中的 .htaccess 文件中。仅允许来自YOUR.SERVER.IP.ADDRESS(显然将其更改为您的服务器 IP)的请求,其他所有人都会收到 403 错误。

鉴于您的评论,那么您会想以某种方式使用访问令牌或其他东西。我设置它的方式是在远程文件服务器上创建一个 PHP 脚本,如果访问令牌匹配,它将为文件提供服务,然后您可以使用 cURL 获取文件。如果访问令牌不匹配,则设置 403 Forbidden 标头。

然后,他们只能使用您的访问令牌访问文件。要使令牌动态化以使其不易被盗,您可以获取盐的 MD5 哈希值以及可以在服务器之间共享的动态变量,例如月份中的某天。动态变量更新越频繁,访问令牌更新越频繁,您就越安全。尝试将您用于盐和散列算法的内容保密,以获得最佳保护。

您可以保留在文件服务器上的基本脚本:

if($_GET['access'] != md5('aihdhgsa8gas8gasgsa8asgdds' . $YOUR_UPDATING_VALUE)){
    //Improper access hash
    header('HTTP/1.1 403 Forbidden');
    die();
}

$files = array('blah.png', 'lol.exe');
$file_to_serve = $_GET['file'];
if(!in_array($file_to_serve, $files)){
    //File isn't in our array
    header('HTTP/1.1 403 Forbidden');
    die();
}else{
    die(file_get_contents($file_to_serve)); //Serve however you need.
}

在您的主服务器上:

$file = file_get_contents('http://example.com/serve.php?file=' . $filename . '&access=' . md5('aihdhgsa8gas8gasgsa8asgdds' . $YOUR_UPDATING_VALUE));

这些是非常粗略的示例,您需要重新处理系统配置的服务和获取,但您明白了。$YOUR_UPDATING_VALUE应该是两台服务器都可以计算出更新频率的东西,我建议不要这样做,microtime因为从另一台服务器获取时会有延迟,而且总是错误的。

于 2011-09-24T00:00:13.987 回答