5

我有 2 台服务器。在服务器 1 上,我有一个 WordPress 网站。在服务器 2 上,我希望 WordPress 站点的成员能够下载大型 .zip 文件。

如何对这些用户进行身份验证,以便只有网站成员才能从第二台服务器下载文件?

是否可以使用 PHP,以便只有来自我的域的引用者才能访问这些文件?

注意:下载文件的链接在 wordpress 网站上受到保护,因此未登录的用户被重定向到加入页面。但是,当前和前成员仍然会知道下载所在的目录,并且可能会下载文件或共享链接。

4

2 回答 2

6

有几种方法可以做到这一点。最安全的方法是在服务器 1 和服务器 2 之间进行一些后端通信。但这里有一个简单的替代方案:

服务器 2:下载.php

<?PHP
 $file = $_GET['f'];
 $code = $_GET['c']; 
 $ip = $_SERVER['REMOTE_ADDR'];

 if ($code != md5($ip . 'salt')) {
    die('authentication denied');
 }

 if(!file)
 {
     die('file not found');
 }

 // Set headers
 header("Cache-Control: public");
 header("Content-Description: File Transfer");
 header("Content-Disposition: attachment; filename=$file");
 header("Content-Type: application/zip");
 header("Content-Transfer-Encoding: binary");

 // Read the file from disk
 readfile('/files/downloads/' . $file);

?>

服务器 1:下载链接

<?PHP
 echo '<a href="http://server2.com/download.php?f=text.txt&c=' . md5($_SERVER['REMOTE_ADDR'] . 'salt') / '">Download File</a>';
?>

该系统通过创建一个链接来工作,该链接只能在为其生成的 IP 上使用。因此,注册用户无法在其他地方共享链接。这不是最安全的事情,但它很容易实现并且会起作用。

于 2012-06-09T21:07:33.683 回答
1

一些巧妙的解决方案可能是使用基于当前时间的令牌系统。您可以获取一天中的当前时间并用一些盐对其进行哈希处理,并将其作为令牌放入查询字符串中。第二台服务器上的 php 脚本可能会检查查询字符串哈希是否相同,因为在服务器端使用相同的盐为一天中的当前时间生成哈希。

为确保用户不会达到小时切换时间,您也可以检查前一小时的哈希值。

它使您可以确定文件 url 的可用时间不会超过两个小时,并保证可用时间为一小时。

在服务器 1 上:

<?php
echo '<a href="server2.com/download.php?token='.md5(date('G')+'secret_word').'&file=file.zip">Link</a>';
?>

在服务器 2 上:

<?php
current_hour_hash = md5( date('G').'secret_word' );
previous_hour_number = ( int(date('G')) - 1 ) % 24;
previous_hour_hash = md5( str(previous_hour_number).'secret_word' );
if($_GET['token']!= current_hour_hash and $_GET['token']!= previous_hour_hash){
    die();
}else{
    ... //code sending file here
}
于 2012-06-09T22:06:36.173 回答