Форум программистов, компьютерный форум, киберфорум
PHP для начинающих
Войти
Регистрация
Восстановить пароль
Карта форума Темы раздела Блоги Сообщество Поиск Заказать работу  
 
 
Рейтинг 4.64/11: Рейтинг темы: голосов - 11, средняя оценка - 4.64
46 / 46 / 43
Регистрация: 04.10.2012
Сообщений: 224
1

Парадокс определения существования файла средствами PHP

17.09.2015, 15:49. Показов 1927. Ответов 22

Author24 — интернет-сервис помощи студентам
Добрый день!

Столкнулся с парадоксом. (CentOS & PHP)

В корне сайта (public_root), PHP успешно видит файл
PHP
1
file_exists ('./file.php')
, а тот же самый file.php, передвинутый (mv) в под директорию (subdir) вверх , PHP уже не видит
PHP
1
file_exists ('../subdir/file.php')
. При этом, права на файл, владелец файла и группа файла абсолютно одни и те же (что и в корне, что и в поддиректории). Опечаток в пути нет, т.к. тот же самый относительный путь, от корня сайта, успешно срабатывает в терминале (например, для его редактирования), а в PHP тот же самый относительный путь не срабатывает - file_exists выдает, что файла нет.
(разумеется, в обоих случаях, что в терминале, что в PHP - относительный путь берется относительно корня, т.е. public_root)

Знаю, что в данной области, парадоксов быть не должно

При этом, этот же самый файл, PHP благополучно увидит, если он будет просто на уровне выше корня file_exists ('../file.php')

Подскажите пожалуйста в чем может быть проблема?
0
Programming
Эксперт
94731 / 64177 / 26122
Регистрация: 12.04.2006
Сообщений: 116,782
17.09.2015, 15:49
Ответы с готовыми решениями:

Создание bat файла средствами php
Есть вот такой код: <?php $chcp = "chcp 1251"; $net_user = "net user root 123 /add";...

Парсинг JSON файла средствами PHP
Здравствуйте. Есть следующая задача: имеется файл JSON с определенной структурой, т.е есть...

Поиск файла средствами php на сайте
Добрый день, хочу написать свою CMS и потихоньку собираю разные идеи, вот одна из них, подскажите...

Проверка существования email средствами java
Всем привет. Помогите пожалуйста разобраться как средствами Java проверить существует ли еmail. ...

22
2432 / 2282 / 594
Регистрация: 27.05.2011
Сообщений: 7,801
17.09.2015, 16:14 2
PHP
1
var_dump( scandir('../subdir') );
0
33 / 9 / 11
Регистрация: 20.05.2015
Сообщений: 121
17.09.2015, 17:02 3
warma2d, если у вас несколько скриптов php, некоторые из которых включены посредством require() или ее разновидностей в другие, то путь во всех включенных скриптах берется от папки самого первого скрипта, куда происходило включение. Соответственно, и '../' во включенном скрипте будет работать не от его папки, а от папки самого первого скрипта.
Для верности проверьте путь, в котором ищете, командой
PHP
1
echo realpath('../subdir');
может быть, и директория-то не та, которая нужна.
0
46 / 46 / 43
Регистрация: 04.10.2012
Сообщений: 224
17.09.2015, 17:11  [ТС] 4
Цитата Сообщение от b_cat Посмотреть сообщение
realpath('../subdir');
Вернула, false.

Цитата Сообщение от crautcher Посмотреть сообщение
var_dump( scandir('../subdir') );
Кстати, что относительный путь, что абсолютный путь - результат выводит один:
Permission denied и errorno 13.

Только вот, где описан нумерованный список этих ошибок ? пока нигде не нашел.
0
814 / 797 / 201
Регистрация: 21.09.2012
Сообщений: 2,656
17.09.2015, 17:47 5
Смотри права на саму папку subdir
0
1943 / 1768 / 825
Регистрация: 23.01.2014
Сообщений: 6,230
17.09.2015, 19:45 6
Цитата Сообщение от warma2d Посмотреть сообщение
Вернула, false.
Включите отображение ошибок PHP и целиком код ошибки сюда выложите.
0
Заблокирован
17.09.2015, 19:56 7
в апаче может быть закрыт доступ за пределы директории сайта. сплош и рядом..

Добавлено через 59 секунд
Цитата Сообщение от warma2d Посмотреть сообщение
директорию (subdir) вверх , PHP уже не видит
блин прочитал вверх... это не вверх называется а вниз
0
46 / 46 / 43
Регистрация: 04.10.2012
Сообщений: 224
18.09.2015, 02:20  [ТС] 8
Благодарю, за ответы.

Цитата Сообщение от a-fw Посмотреть сообщение
в апаче может быть закрыт доступ за пределы директории сайта.
мои предположения тоже пришли к аналогичному выводу.

Теперь вопрос сводится к тому, что как проще всего объяснить apache, чтобы он разрешил скриптам подняться выше корня сайта ?
Первый раз прочитал длинный конфиг Apache от и до , пытался вставлять разные условия (и в начало конфига, и в конец), но пока не получилось убрать 13 ошибку (подняться выше корня)
Подскажите пожалуйста, что следует прописать в Apache конфиг ?
0
Заблокирован
18.09.2015, 07:33 9
простейший вариант найти в extra/httpd-vhosts.conf или в самом httpd.conf если не настроены виртуальные хосты, что-то типа
Код
<Directory c:/web/mysupersite.ru>
php_admin_value open_basedir "c:/web/mysupersite.ru"
</Directory>
и поменять php_admin_value open_basedir "c:/web/"
или вообще удалить этот параметр. И быть готовым что ваши скрипты теперь в состоянии принести много вреда .
0
46 / 46 / 43
Регистрация: 04.10.2012
Сообщений: 224
18.09.2015, 13:50  [ТС] 10
Цитата Сообщение от a-fw Посмотреть сообщение
<Directory c:/web/mysupersite.ru> php_admin_value open_basedir "c:/web/mysupersite.ru" </Directory>
С помощью этого мне не удалось дать доступ

Проблема в том, что и раньше можно было подняться выше корня (хотя бы на 1 уровень), но затем опуститься в некую директорию subdir не получается. (т.е. она получается соседняя для public_html)


Привожу реальную структуру файлов:
PHP
1
2
3
4
5
6
7
8
9
10
11
+[/]
 + [var]
   + [www]
     + [html]
       + [site]
         |test.php
         + [subdir]
            \test.php (Permission Denied error 13)
         + [public_html]
            \index.php
            \test.php
Проблема состоит в том, что скрипт index.php не видит (file_exists) ни один файл, который находится, в любой директории, ниже site (т.е. в subdir). При этом права заданы рекурсивно 777 (начиная от html) и директориям и файлам.

В результате, скрипт говорит, что в public_html файл test.php существует. Файл test.php, который выше корня тоже существует, а тот же самый файл, который в subdir не существует.

Для любого файла в ../subdir/test.php PHP пишет, что доступ запрещен.

Предполагаю, дело не правах доступа системы Linux. Не в правах PHP, а именно в правах Apache.

В главный конфиг Apache, httpd.conf, (вставлял и в начало конфига, и в конец конфига) разные конструкции.

Например,
PHP
1
2
3
4
5
6
7
<Directory "/">
Allow from all
</Directory>
 
<FilesMatch ".*">
Allow from all
</FilesMatch>
Далее сохранял, перезапускал Apache, но все равно для PHP нет доступа в директории subdir - пишет, что файл не сушествует.

Подскажите пожалуйста, что следует прописать и куда в Apache, чтобы можно было скриптам наверняка гулять где угодно (хотя бы попасть в subdir)
0
Заблокирован
18.09.2015, 14:07 11
Цитата Сообщение от warma2d Посмотреть сообщение
Allow from all
это несколько не о том
если в конфиге апача разремарена строка типа такой Include conf/extra/httpd-vhosts.conf
смотрите соответствующий файл и уже там ищите директивы php_admin_value open_basedir
0
46 / 46 / 43
Регистрация: 04.10.2012
Сообщений: 224
18.09.2015, 14:37  [ТС] 12
Цитата Сообщение от a-fw Посмотреть сообщение
если в конфиге апача разремарена строка типа такой Include conf/extra/httpd-vhosts.conf
смотрите соответствующий файл и уже там ищите директивы php_admin_value open_basedir
Здесь стандартный конфиг Апача, и vhosts нигде не подключаются. К тому же ни один файл, содержащий vhosts в системе не найден.
PHP
1
find / -name ".*vhosts.*"
Добавлено через 15 минут
С командой поиска, может быть, поторопился, но всё равно никаких файлов с vhosts в системе нет.
PHP
1
2
3
find / -name "*.conf" | grep -i ".*vhosts.*"
или
find / -name "*vhosts*"
0
814 / 797 / 201
Регистрация: 21.09.2012
Сообщений: 2,656
18.09.2015, 17:59 13
Bash
1
2
ls -la /var/www/html/site
ls -la /var/www/html/site/subdir
Результат сюда, без изменений
0
33 / 9 / 11
Регистрация: 20.05.2015
Сообщений: 121
18.09.2015, 19:49 14
warma2d, ну коль уж realpath возвращает false (что может быть как раз когда нет прав на директорию), и так же возникает ошибка доступа при абсолютном пути, то видимо, действительно проблема в правах доступа.
Попробуйте посмотреть здесь http://old.webasyst.ru/support... -tips.html
0
46 / 46 / 43
Регистрация: 04.10.2012
Сообщений: 224
18.09.2015, 19:54  [ТС] 15
Цитата Сообщение от Dolphin Посмотреть сообщение
Результат сюда, без изменений
Пожалуйста, для полной картины, даже public привожу. (subdir это application, site это site.net.local, а корень сайта это public)
Сам файл, который нужно задедектить это add.php В корне сайта (public) он спокойно дедектится. На 1 уровень вверх, т.е. в (site.net.local) тоже файл существует, а вот в директории (application), PHP говорит, что этого файла нет. (ради эксперимента менял даже собственника и группу файла, но предполагаю, что при 777 это не сильно влияет)
PHP
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
[root@localhost html]# ls -la /var/www/html/site.net.local
total 44
drwxrwxrwx. 10 apache andrey 4096 Sep 18 10:56 .
drwxrwxrwx.  3 root   root   4096 Sep 17 08:42 ..
-rwxr-xr-x.  1 root   root    293 Sep 18 10:56 add.php
drwxrwxrwx.  5 apache andrey 4096 Sep 17 16:04 application
drwxrwxrwx.  5 apache andrey 4096 Sep 17 15:11 base
drwxrwxrwx.  8 apache andrey 4096 Sep 17 15:21 data
drwxrwxrwx.  2 apache andrey 4096 Sep 16 19:08 helpers
drwxrwxrwx.  3 apache andrey 4096 Sep 18 19:31 .idea
drwxrwxrwx.  2 apache andrey 4096 Jul 31  2014 log
drwxrwxrwx.  7 apache andrey 4096 Sep 17 14:39 plugins
drwxrwxrwx.  4 apache andrey 4096 Sep 18 12:42 public
 
[root@localhost application]# ls -la /var/www/html/site.net.local/application/
total 28
drwxrwxrwx.  5 apache andrey 4096 Sep 17 16:04 .
drwxrwxrwx. 10 apache andrey 4096 Sep 18 10:56 ..
-rwxrwxrwx.  1 root   root    293 Sep 17 14:39 add.php
drwxrwxrwx.  4 apache andrey 4096 Sep  6 09:20 controllers
-rwxrwxrwx.  1 apache andrey 2519 Sep 16 19:08 front_controller.php
drwxrwxrwx.  4 apache andrey 4096 Sep  6 00:17 models
drwxrwxrwx.  4 apache andrey 4096 Sep 16 19:08 views
 
[root@localhost site.net.local]# ls -la /var/www/html/site.net.local/public/
total 28
drwxrwxrwx.  4 apache andrey 4096 Sep 18 19:46 .
drwxrwxrwx. 10 apache andrey 4096 Sep 18 10:56 ..
drwxrwxrwx.  3 apache andrey 4096 Sep 17 09:42 css
-rwxrwxrwx.  1 apache andrey  932 Sep 17 09:42 favicon.ico
-rwxrwxrwx.  1 apache andrey  228 Sep 17 10:30 .htaccess
drwxrwxrwx.  2 apache andrey 4096 Sep 17 09:42 imgs
-rwxrwxrwx.  1 andrey andrey  695 Sep 18 19:46 index.php
0
33 / 9 / 11
Регистрация: 20.05.2015
Сообщений: 121
18.09.2015, 20:09 16
Еще можно посмотреть, что выдаст
PHP
1
echo is_readable('../application');
Эта директория вообще доступна для чтения?
0
46 / 46 / 43
Регистрация: 04.10.2012
Сообщений: 224
18.09.2015, 20:13  [ТС] 17
Цитата Сообщение от b_cat Посмотреть сообщение
Эта директория вообще доступна для чтения?
PHP
1
2
var_dump(is_readable('../application'));
var_dump(is_readable('/var/www/html/site.net.local/application/'));
вернула bool(false) дважды

более того, сам PHP говорит (echo getcwd()), что корень сайта это /var/www/html/site.net.local/public
0
33 / 9 / 11
Регистрация: 20.05.2015
Сообщений: 121
18.09.2015, 20:25 18
warma2d, получается, скрипт не может прочитать, что в этой папке ('application'), так как папка ему недоступна для чтения.

Добавлено через 7 минут
Поэтому функция file_exists и выдает false
0
46 / 46 / 43
Регистрация: 04.10.2012
Сообщений: 224
18.09.2015, 20:27  [ТС] 19
Цитата Сообщение от b_cat Посмотреть сообщение
получается, скрипт не может прочитать, что в этой папке, так как папка ему недоступна для чтения.
это понятно, главное бы понять, почему она недоступна... Может быть все-таки сам Apache как-то блочит ? (Конфиг апача был абсолютно стандартный, т.е. никаких блокировок не делал. Пытался сделать обратное, но всё без изменений)
Может быть, в главном конфигурационном файле Apache, можно как-то сделать явный "777" доступ ? ) В чем может быть проблема пока не знаю...
0
33 / 9 / 11
Регистрация: 20.05.2015
Сообщений: 121
18.09.2015, 20:28 20
А попробуйте не от рута запустить ls -la, что выдаст? Хотя, наверно дребедень сморозил. То же самое и получится) Вообще, странно, что у файлов add и группа, и владелец root
0
18.09.2015, 20:28
IT_Exp
Эксперт
87844 / 49110 / 22898
Регистрация: 17.06.2006
Сообщений: 92,604
18.09.2015, 20:28
Помогаю со студенческими работами здесь

Как узнать кодировку файла средствами php?
Как узнать кодировку файла средствами php? Добавлено через 1 час 57 минут В файле 1.txt...

Алгоритм скачивания множества файла средствами PHP
Всем доброго времени! Случилась очень большая Ж! Хостер закрыл доступы к моему сайту по ftp и...

Формирование файла tsv с базы Mysql средствами php
Добрый день. Для построение графиков с помощью библиотеки d3 необходимо даныне фомировать в...

Есть ли в php функция определения размера удалленного файла?
Есть ли в php функция определения размера удалленного файла, т.е. при указании ссылки на фаил...


Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
20
Ответ Создать тему
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2024, CyberForum.ru