我有2台服务器。在服务器1上,我有一个WordPress网站。在服务器2上,我有大量的.zip文件,我希望WordPress网站的成员能够下载。保护远程服务器上的下载文件
如何对这些用户进行身份验证,以便只有属于该网站成员的人才能从第二台服务器上下载文件?
是否可以使用PHP,以便只有来自我的域的引用者才能访问这些文件?
注意:下载文件的链接在wordpress网站上受到保护,以便未登录的用户被重定向到加入页面。但是,当前成员和前成员仍然会知道下载的目录,并且可能会下载文件或共享链接。
我有2台服务器。在服务器1上,我有一个WordPress网站。在服务器2上,我有大量的.zip文件,我希望WordPress网站的成员能够下载。保护远程服务器上的下载文件
如何对这些用户进行身份验证,以便只有属于该网站成员的人才能从第二台服务器上下载文件?
是否可以使用PHP,以便只有来自我的域的引用者才能访问这些文件?
注意:下载文件的链接在wordpress网站上受到保护,以便未登录的用户被重定向到加入页面。但是,当前成员和前成员仍然会知道下载的目录,并且可能会下载文件或共享链接。
有几种方法可以做到这一点。最安全的方法是有服务器1和&服务器2之间的一些后端的通信,但是这里是一个很不错的选择:
服务器2:的download.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使用的链接。因此,注册用户无法在其他地方共享链接。这不是最安全的事情,但它易于实施并且可以工作。
谢谢你的回应!对于服务器2代码,这需要放在域上,或者直接上传到服务器的IP?我还假设“从磁盘读取文件”部分 - 我想要文件位于读取文件中('my/download/path/here'目录? – user1446650
server2的代码只需公开访问。是更改“/ files/downloads /”以符合您的需求。请将答案标记为已接受。 –
一些简洁的解决方案可能是基于当前时间使用令牌系统。您可以在一天中的当前小时内使用一些salt进行散列,并将其作为标记放入查询字符串中。第二台服务器上的php脚本可能会检查查询字符串散列是否相同,因为在服务器端使用相同的salt生成当前小时的散列值。
为了确保用户不会碰到小时切换时间,您也可以检查前一小时的哈希值。
它使您确定文件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
}
当心有关使用基于在当前时间戳令牌。同时可以发生多少事情,使用基于时间的令牌确实是一个非常糟糕的主意,除非在该字符串中有一些前缀并且它必须是唯一的。尝试使用由数据库生成的唯一ID,这是完全安全的。 – B4NZ41