Защита файлов на удаленном сервере - PullRequest
1 голос
/ 24 сентября 2011

Вот ситуация.

У меня есть основной веб-сервер, который должен иметь доступ к файлам на удаленном веб-сервере с помощью PHP.У меня также есть удаленный сервер.Файлы на удаленном сервере являются частными.То есть я хочу получить к ним доступ только через свой сценарий PHP на основном сервере.

Как разрешить доступ только к каталогу файлов с основного сервера, но запретить доступ кому-либо еще?

1 Ответ

4 голосов
/ 24 сентября 2011

В вашем файле .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, потому что будет задержка при загрузке с другого сервера, и это всегда будет ложным.

...