Безопасная передача путей в скрипт

cyberbat

Новичок
Безопасная передача путей в скрипт

Есть некий скрипт, одна из функций которого: простейший файл-броузер. То есть пользователю выводится страничка со списком файлов и директорий, каждый элемент которого ссылка на конкретный файл или на список файлов в директории (через этот же скрипт). То есть мне надо скрипту передавать путь, с которым он работает. Вопрос в том, как это сделать максимально безопасно? Пользователю должны быть доступны только файлы, лежащие в директории со скриптом и ее поддиректориях. Пока придумалось два варианта:
1. передавать путь через GET\POST, выполняя всякие разные проверки. Вот только хотелось бы узнать полный список то что надо проверять, чтобы что-то не забыть. Лучше в регулярных выражениях сразу :)
2. Передавать путь в закодированном виде, например, 1_15_3_7, где каждое число - это номер папки в директории, а конечное номер файла или папки. Но интуитивно чувствую много трудностей связанных с этим методом, хоть и безопасно. Хотелось бы услышать еще менее глючные варианты кодирования пути.
3. ... может быть кто-нибудь предложит еще метод передачи путей в скрипт?

Заранее спасибо
 

tf

крылья рулят
Лучше в регулярных выражениях сразу
ага, сейчас напишу
0_0_0_bin/

1. существует список доспутных файлов прописаных в скрипте
2. существует много файловых браузеров, может сначало посмотриш как там все устроено?
 

cyberbat

Новичок
Автор оригинала: tf


0_0_0_bin/
это к чему?

Автор оригинала: tf
1. существует список доспутных файлов прописаных в скрипте
2. существует много файловых браузеров, может сначало посмотриш как там все устроено?
А как п.1 позволит избавится от выхода пользователя в корень? Через / или ..
Я смотрел существующие скрипты. Там все делается через проверку переменной через регэкспы на 5 строк. Если все-таки придется приходить к этому методу, то хотелось бы услышать что именно проверять\вырезать.
 

Anarki

Новичок
Я думаю можно защитить следующим образом.

Запретить смену папки через chdir, а работать с opendir.

В приходящих путях от пользователя вырезать начальные слеши /, а также две точки ..
Либо получать каноническое путевое имя через realpath и сравнивать с физическим путем к скрипту.
Скажем юзер запросил ./files2/images/1.jpg
Полный путь к скрипту /home/user/www/script/script.php
PHP:
<?php
$up = './files2/images/1.jpg';
$sp = '/home/user/www/script/script.php';

$script_dir = dirname($sp);
$user_dir = dirname(realpath($up)); // будет /home/user/www/script/files2/images
if (strpos($user_dir,$script_dir) !== false) {
	echo 'Допустимый путь';
} else {
	echo 'Недопустимый путь';
}
?>
 
Создаешь список доступных путей (можно и с некими псевдонимами).
Например
$pathset = array('bin/modules/admin.php', 'src/articles/view.php');
принимаешь переменную извне
$path = isset($_POST['path']) ? (string) $_POST['path'] : null;

проверяешь входит ли этот путь в список доступных
if (in_array($path, $pathset)) { include } else { figvam }
 

Anarki

Новичок
Автор оригинала: mishco
Создаешь список доступных путей (можно и с некими псевдонимами).
Например
$pathset = array('bin/modules/admin.php', 'src/articles/view.php');
принимаешь переменную извне
$path = isset($_POST['path']) ? (string) $_POST['path'] : null;

проверяешь входит ли этот путь в список доступных
if (in_array($path, $pathset)) { include } else { figvam }
Ага, а если тысяча файлов, то он все их будет расписывать в массиве? А если менеджером новый файл создаст - обновлять массив?
 
Anarki
а что обязательно в массив? обязательно руками? по щучьему веленью только костыли работают :Р
 

Страшный Злодей

Бывший член клуба (достало хамство).
cyberbat
возможно, вы пытаетесь найти не совсем то решение, что вам поможет... (предположение только..) Если есть возможность пользователю открывать файлы и каталоги без вашего скрипта, например, просто GET-запросом или ещё как, то безопасность будет поставлена под угрозу. Может быть лучше просто грамотно расставить права доступа к каталогам и файлам? А уж потом, если возникнет необходимость, используйте что-нибудь типа [m]is_readable[/m]..
 

Фанат

oncle terrible
Команда форума
mishco
нафига список доступных путей, если по определению будет один каталог корневой для доступа.
а дальше - по алгоритму Anarki.
нафига какой-то массив городить.

Страшный Злодей
для кого ты собрался права выставлять? для пользователя, который сайт просматривает?
 

Страшный Злодей

Бывший член клуба (достало хамство).
Фaнaт
Для пользователя и скрипта, которым он просматривает. Архитектура приложения мне неизвестна, возможно, там идет речь не о сайте вообще, может быть и оффлайн браузер или LAN браузер. Основываясь на фразе "Пользователю должны быть доступны только файлы, лежащие в директории со скриптом и ее поддиректориях..." и высказываю свои опасения… При невнимательной реализации возможна угроза безопасности. У меня была похожая задача и проблема при реализации некоторого подобия корпоративного браузера файлов на удаленном сервере, предостерегаю от граблей так сказать..
 

Фанат

oncle terrible
Команда форума
Страшный Злодей
то о чем ты говоришь - это настройка СЕРВЕРА.
а человек спрашивает про другое.
 

LupineDreamer

Новичок
Если не нужно давать доступ к файлу по ссылке помимо скрипта, то можно делать так:

1. Изначально храним путь к корневой директории(в сессии).
2. При переходе в другую директорию - изменяем текущий путь соответственно.

3. Вместо ссылок передаем номера файлов.
4. Когда хотим возвратить файл - достем из сессии путь к текущей папке и даем доступ к файлу с соответствующим номером.

пример:
на каком-то шаге в сессии хранится
$dir_path = '/path/to/dir/';

выводим файлы из этой дириктории:
файл#1 - ссылка на него getfile?num=1
файл#2 - ссылка на него getfile?num=2
...

когда пользователь захочет открыть файл#n, то мы берем из сессии $dir_path, в нем ищем n-ый файл и возвращаем

аналогично нумеруем директории...



а вот когда нужно давать доступ к файлу помимо интерфейса браузера файлов - то тут только регулярка....
 

cyberbat

Новичок
Автор оригинала: Anarki
Либо получать каноническое путевое имя через realpath и сравнивать с физическим путем к скрипту.
Спасибо большое. В итоге остановился на этом методе как самом простом и как мне кажется надежном. Я насчет надежности не ошибаюсь? Это можно как-нибудь обойти?

P.S. Уточню. Эта часть скрипта просто броузер директорий и файлов, лежащих не сервере.
 

Фанат

oncle terrible
Команда форума
проблем с безопасностью не должно быть.

кстати, hint
можно не передавать пути в адресной строке.
если это у тебя именно браузер файлов, и нужна возможность только перемещаться по дереву каталогов и показывать ссылки на файлы (аналог +indexes в настройке апача) то можно сделать единственный индексный файл для всех подкаталогов и он будет запускаться для каждого каталога.
для этого всего лишь надо указать в directoryIndex полный путь от корня сайта.
 

FlexIDK

Новичок
а если указывать id только последнего элемента, и на сервере прорисовывать весь путь...?!...
выстаить масси зависимостей как id к parentid отноститься...
 

Фанат

oncle terrible
Команда форума
FlexIDK
вопрос давно решен. людьми, которые с этим сталкивались на практике.
а ты все суетишься с теоретическими предположениями.
 
Сверху