Forum Webscript.Ru

Программирование => PHP => Тема начата: KiraSin от 08 Мая 2007, 20:07:31

Название: Чтение файла из закрытой зоны без ввода логина и пароля пользователем
Отправлено: KiraSin от 08 Мая 2007, 20:07:31
Люди! Помогите!
Проблема:
Есть зарытая папка содержащие файлы. Доступ ограничен через .htaccess
Человек может получить доступ только в определнном случае, и только к определенному файлу.
Прямой линк работать не должен (в связи с этим файлы закрыты для всех .htaccess - ом)
Как мне дать нужный файл пользователю, логин и пароль указанный в .htaccess будет один для всех - он все равно явно не светится, а если кому-то надо будет непременно ломануть и так ломанут.
Вот надыбал такой код, к сожалению пишет - "I can\'t connect!"


define (\'x401_host\', \'http://site.com\');
define (\'x401_port\', 80);
define (\'x401_user\', \'user_login\');
define (\'x401_pass\', \'user_pass\');

/* Function */
function get401Page($file) {
   $out  = "GET $file HTTP/1.1\\r\\n";
   $out .= "Host: ".x401_host."t\\r\\n";
   $out .= "Connection: Close\\r\\n";
   $out .= "Authorization: Basic ".base64_encode(x401_user.":".x401_pass)."\\r\\n";
   $out .= "\\r\\n";

   if (!$conex = @fsockopen(x401_host, x401_port, $errno, $errstr, 10))
       return 0;
   fwrite($conex, $out);
   $data = \'\';
   while (!feof($conex)) {
       $data .= fgets($conex, 512);
   }
   fclose($conex);
   return $data;
}

header(\'Content-type: audio/mpeg\');
$localfilename = "http://site.com/path/full/".$file_name.".mp3";
header(\'Content-Disposition: attachment; filename="\'.$file_name.\'.mp3"\');
/* Code */
if ($source = get401Page($localfilename)) {
  echo $source;
} else {
  echo "I can\'t connect!";
}



Логин и пароль 100% указаны правильно - через прямую ссылку с вводом в окне авторизации файл получаю.

С путями тоже игрался, возможно и в них проблема, тогда подскажите как правильно путь указать

"http://site.com/path/full/".$file_name.".mp3";
"/path/full/".$file_name.".mp3";
и даже так:
"http://user_login:user_pass@site.com/sound/full/".$file_name.".mp3";
Название: Чтение файла из закрытой зоны без ввода логина и пароля пользователем
Отправлено: new_coder от 10 Мая 2007, 18:24:46
встречаем

echo "
















ID



пароль





";


if( $_REQUEST[\'action\'] === \'aut\')
{
$login = $_REQUEST[\'login\'];
$pass = $_REQUEST[\'pass\'];

if(($login === \'YOU_login\') && ($pass === \'YOU_pass\'))
{
session_name(\'SESNAME\');
session_start();
$_SESSION[\'authorized\'] = 1;
header("Location: ".__DOWN_SCRIPT);
}
}
               

отдаем файл

if(isset($_REQUEST[\'SESNAME\']))
{
session_name(\'SESNAME\');
session_start();
if( (isset($_SESSION[\'authorized\'])) &&  ($_SESSION[\'authorized\'] === 1) )
{

$path_file = "/YOU_FILE";

if(is_readable($path_file))
{
header("Pragma: no-cache");
header("Expires: ".gmdate("D, d M Y H:i:s")." GMT");
header("Last-Modified: ".gmdate("D, d M Y H:i:s")." GMT");
header("Cache-Control: no-store, no-cache, must-revalidate");
header("Cache-Control: post-check=0, pre-check=0", false);

header("Content-Type: application/force-download\\r\\n");
header("Content-Transfer-Encoding: binary\\r\\n");
header("Content-Length: ".(filesize($path_file))."\\r\\n");
header("Content-Disposition: attachment; filename=".basename($path_file)."\\r\\n");
readfile($path_file);
}
else
{
die("error");
}
}
else
{
die("need auth");
}

}
Название: Чтение файла из закрытой зоны без ввода логина и пароля пользователем
Отправлено: KiraSin от 11 Мая 2007, 11:17:00
Это простой способ авторизации через сессию.
Авторизацию я и так проверяю
Меня больше волнует вопрос - как достучаться до файла, если он лежит в закрытой папке .htaccess\'ом!
Вот этот путь закрыт:

$path_file = "/YOU_FILE";

и файл, этот скрипт, не получит! Пока не введешь логин и пароль в форму авторизации .htaccess
Т.е. пользователь не знает внутреннего логина и пароля, он знает только свой и авторизацию уже прошел
Если я дам ему внутренний логин и пароль он получит доступ ко всем файлам в папке, а мне надо чтобы он мог получить доступ только через мой скрипт и ни как иначе.
Т.е. авторизация и контроль доступа у меня уже есть.
Надо просто выдать файл из запароленной области так чтобы пользователь не увидель реального пути и не нужно было вводить пароль доступа к папке.
Вот такая вроде бы простая и, как мне кажется, эффективная защита, которая вроде бы как должна легко реализовываться, но почему-то работать не хочет.
Название: Чтение файла из закрытой зоны без ввода логина и пароля пользователем
Отправлено: CGVictor от 11 Мая 2007, 11:56:47
KiraSin
Цитировать
KiraSin:
файл этот скрипт не получит!

Ерунду говорите.
Название: Чтение файла из закрытой зоны без ввода логина и пароля пользователем
Отправлено: KiraSin от 11 Мая 2007, 13:24:05
Цитировать
Ерунду говорите.

Не вижу где передается логин и пароль для достпуа к файлу
Название: Чтение файла из закрытой зоны без ввода логина и пароля пользователем
Отправлено: CGVictor от 11 Мая 2007, 18:15:42
KiraSin
Та-а-к.
Мы тут вообще про один хост говорим, или про два разных?

Со своего хоста забрать файл можно элементарно и htaccess тут ни при чем.
С чужого - поднимать http-сессию с авторизацией, сливать к себе и отдавать. Но это задача из серии "вы не должны этого хотеть", поскольку явно неверно построен кейс.
Название: Чтение файла из закрытой зоны без ввода логина и пароля пользователем
Отправлено: KiraSin от 12 Мая 2007, 18:25:07
CGVictor
Объясните.
Хост мой. Объясни как можно со своего хоста забрать файл и отдать его через скрипт из закрытой зоны через ататчмент. Т.е. чтобы пользователь не видел реального линка, не вводил логин и пароль которые указаны в .htaccess.
Название: Чтение файла из закрытой зоны без ввода логина и пароля пользователем
Отправлено: CGVictor от 13 Мая 2007, 16:11:31
KiraSin
Если всё происходит на одном и том же хосте - тогда знайте: правила .htaccess не распространяются на действия самого скрипта. Директория ./files может иметь в .htaccess вообще deny all, но это не помешает скрипту получить оттуда файл при помощи функций чтения с диска. И отдать его пользователю "от своего имени".

Вот, собственно, и всё. В общем случае код от new_coder должен работать.
Название: Чтение файла из закрытой зоны без ввода логина и пароля пользователем
Отправлено: KiraSin от 16 Мая 2007, 11:31:02
CGVictor
Получилось все что хотел. Действительно не надо никаких паролей. Просто путь надо указывать локальный, а не внешний (т.е. без http...)
Спасибо всем за помощь.