我有2台服务器。在服务器1上我有一个WordPress网站。在服务器2上,我有大量的.zip文件,我希望WordPress网站的成员能够下载。
如何对这些用户进行身份验证,以便只有作为网站成员的人才能从第二台服务器下载文件?
是否可以使用PHP以便只有来自我的域的引用才能访问这些文件?
注意:在wordpress网站上保护下载文件的链接,以便将未登录的用户重定向到连接页面。但是,当前和前成员仍然会知道下载的目录,并且可能下载文件或共享链接。
答案 0 :(得分:6)
有几种方法可以做到这一点。最安全的方法是在服务器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上使用的链接来工作。因此注册用户无法在其他地方共享链接。它不是最安全的东西,但它很容易实现并且可以工作。
答案 1 :(得分:1)
一些巧妙的解决方案可能是使用基于当前时间的令牌系统。您可以获取当天的当前小时并使用一些盐哈希,并将其作为标记放入查询字符串中。比第二台服务器上的PHP脚本可能会检查查询字符串哈希是否相同,就像在服务器端使用相同的盐生成当天的当前小时一样。
为了确保用户不会达到小时切换时间,您也可以检查上一小时的哈希值。
它可以确保文件网址在两小时内无法使用,保证可用时间为一小时。
在服务器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
}