inpost, писал давно в личку, в одной из тем он мне об этом напомнил
*Удалил часть контента*
Это была речь про ExampleCMS (для соревнования с twin), там была папка web для публичной части, а все скрипты находились выше на уровень. Пример тут
https://bitbucket.org/cheevauva/examplecms/srcНо я не вижу проблемы, точне я не вижу что это проблема, которую надо решать в коде, она решается на уровне администрирования http-сервера. Если я не прав, то буду рад вашему мнению.
! |
|
М |
| Выставлять личную переписку без разрешения второй стороны - противозаконно, а так же мерзко и неуважительно к другому человеку. |
inpost |
_____________
Люди, имеющие низкий уровень квалификации, делают ошибочные выводы, принимают неудачные решения и при этом неспособны осознавать свои ошибки в силу низкого уровня своей квалификации
ApuktaChehov
13.05.2015 - 18:09
Может стоит пытаться писать код так, что бы нельзя было несанкционированно путешествовать по каталогам?
Например, запретить использовать в путях две точки подряд.
Везде использовать только относительный путь, который уже самим скриптом, будет дополняться до абсолютного.
Цитата |
там была папка web для публичной части, а все скрипты находились выше на уровень. |
У меня тоже есть такая папка для публичной части. Я в ней php вообще отрубил )
_____________
inpost
13.05.2015 - 18:11
cheeИсправь свой вопрос так, чтобы он не нарушал личные данные каждого.
_____________
Обучаю веб-программированию качественно и не дорого:
http://school-php.comФрилансер, принимаю заказы: PHP, JS, AS (видео-чаты). Писать в ЛС (Личные сообщения на phpforum).
ApuktaChehov, тут про другое дело. inpost говорит что нужно своим скриптам задавать open_basedir, что бы сам php недавал подключиться выше определенной директории.
Но я не очень понял, почему мой скрипт вдруг стал уязвим, ведь open_basedir все еще можно применить для уровня где лежит код сайта, а на публичную часть выдавать то, что лежит в папке web, и делается это с помощью веб-сервера. Я не прав?
_____________
Люди, имеющие низкий уровень квалификации, делают ошибочные выводы, принимают неудачные решения и при этом неспособны осознавать свои ошибки в силу низкого уровня своей квалификации
ApuktaChehov
13.05.2015 - 20:22
А open_basedir распространяется на виртуальные хосты? Это же настройка самого php.
А если так, то она распространяется на папку в которой работает php. А php работает в тех папках, который ему укажет веб сервер. Учитывая, что в open_basedir указывается имя директории, то каким образом её можно использовать на разные директории в приделах всего веб сервера(виртуальные хосты).
Остается настройка через .htaccess. Но если php_flag не работает? Оно бесполезно?
chee
Ну можно создать 2 папки в корне хоста. Публичную и прватную. В open_basedir указать приватную папку и тогда из публичной нельзя будет ничего подключить.
А в examplecms php файлы лежат в том же каталоге, что и паблик. Таким образом в examplecms применять open_basedir нет смысла.
_____________
ApuktaChehov, я не понял твоего примера.
_____________
Люди, имеющие низкий уровень квалификации, делают ошибочные выводы, принимают неудачные решения и при этом неспособны осознавать свои ошибки в силу низкого уровня своей квалификации
ApuktaChehov
14.05.2015 - 13:38
chee
У нас есть сайт.
Папки в корне сайта:
- Private. Тут лежат исполняемые php файлы.
- Public. Тут лежат картинки, css, js, шрифты и т.д.
Указываем в open_basedir каталог Private. И php не сможет подключить файлы из каталога Public. Так же в каталоге Private запрещаем доступ всем и вся.
Даже веб серверу, только исполнение файлов.
А в examplecms это сделать нельзя, т.к. там публичная папка web(если я правильно все понял) находится ядом с системными папками и файлами, т.е. в одном каталоге.
_____________
killer8080
14.05.2015 - 13:48
Цитата (ApuktaChehov @ 14.05.2015 - 12:38) |
Указываем в open_basedir каталог Private. И php не сможет подключить файлы из каталога Public. |
а как же index.php ? Он то в public
UPD плюс директория для публичного аплоада то же в паблик.
Цитата (ApuktaChehov @ 14.05.2015 - 12:38) |
Так же в каталог Private запрещаем доступ всем и вся. Даже веб серверу, только исполнение. |
Без доступа на чтение скрипты работать небудут, а права на исполнение им может и не нужны, если сапи апача.
ApuktaChehov
14.05.2015 - 14:08
Цитата |
а как же index.php ? Он то в public |
А он не должен быть в корне сайта? Т.е. в одном каталоге и с Private и с Public.
Цитата |
UPD плюс директория для публичного аплоада то же в паблик. |
Для загруженных файлов есть move_file_upload.
Цитата |
Без доступа на чтение скрипты работать не будут, |
Исполнение подразумевает чтение, иначе как система выполнит то, что не может прочесть
Я имею виду, исполнение файлов интерпретатором php(веб сервером).
_____________
ApuktaChehov
14.05.2015 - 14:17
На самом деле с index.php и в праву косяк.
Если open_basedir поставить на папку Private, то index.php нельзя будет исполнить.
Надо подумать...
_____________
killer8080
14.05.2015 - 14:24
Цитата (ApuktaChehov @ 14.05.2015 - 13:08) |
А он не должен быть в корне сайта? Т.е. в одном каталоге и с Private и с Public. |
а разве нет? Могу конечно ошибаться, но rewrite htaccess пляшет от document root, и вроде выше прыгнуть не может.
Цитата (ApuktaChehov @ 14.05.2015 - 13:08) |
Для загруженных файлов есть move_file_upload. |
ну во первых open_basedir накладывает ограничение и на неё, во вторых не всегда нужно тупо переместить загруженный файл, иногда чаще всего, его нужно предварительно обработать, и в аплоад положить результат обработки.
Цитата (ApuktaChehov @ 14.05.2015 - 13:08) |
Исполнение подразумевает чтение, иначе как система выполнит то, что не может прочесть |
это справедливо только для скриптов, бинарникам не нужно право на чтение, достаточно права на исполнение чтоб его запустить. Ты же написал
Цитата (ApuktaChehov @ 14.05.2015 - 12:38) |
Так же в каталоге Private запрещаем доступ всем и вся. Даже веб серверу, только исполнение файлов. |
PS пока писал ты уже ответил, но оставлю как есть
ApuktaChehov
14.05.2015 - 14:31
cheekiller8080Короче я понял, где косяк. Все было бы хорошо, если бы не index.php.
Похоже, open_basedir создана для защиты ОС от взлома из php. Что бы в принципе нельзя было обратиться к файлам вне вебсервера.
Читая мануал по open_basedir было ощущение, что она запрещает только чтение и запись файлов. Но оказалось, даже открытие каталогов запрещено.
Тогда давайте дождемся inpost-а, для просветления
_____________
Вот конфиг для nginx, кто мне мешает делать так?
location ~ \.php$ {
root /var/www/html/examplecms/web/;
fastcgi_split_path_info ^(.+\.php)(/.+)$;
fastcgi_pass unix:/var/run/php5-fpm.sock;
fastcgi_index index.php;
fastcgi_param PHP_ADMIN_VALUE "open_basedir=/var/www/html/examplecms/";
fastcgi_param SCRIPT_FILENAME $document_root$fastcgi_script_name;
include fastcgi_params;
}
Обработка запросов идет из папки web, но можно подключать файлы, которые находится на уровень выше.
_____________
Люди, имеющие низкий уровень квалификации, делают ошибочные выводы, принимают неудачные решения и при этом неспособны осознавать свои ошибки в силу низкого уровня своей квалификации
killer8080
14.05.2015 - 14:53
Цитата (chee @ 13.05.2015 - 16:47) |
Но я не вижу проблемы, точне я не вижу что это проблема, которую надо решать в коде, она решается на уровне администрирования http-сервера. |
ну в общем то да, это чисто вопрос администрирования.
ApuktaChehov
14.05.2015 - 18:43
cheeВообщем я провел совещания, а после опросил присутствующих и в результате принял решение по твоему вопросу.
open_basedir нужно использовать. Что бы никаким образом злоумышленник не смог выбраться из базовой директории твоего проекта.
Если ты админ сервера, тебе и флаг в руки, рули как хочешь и как посчитаешь нужным. А если нет, то стоит позаботится о таких вещах, а не надеяться на админов сервера.
_____________
Быстрый ответ:
Powered by dgreen
Здесь расположена полная версия этой страницы.