Назад | Перейти на главную страницу

Сделайте файл доступным для PHP, но не извне

Мой хост дает мне две папки для использования: /home/public/ куда идут страницы, и /home/private/, который предназначен для моего личного использования. Я хотел бы, чтобы PHP создал файл, который мог бы читать я с машины, но не кто-либо другой через Интернет. Эту проблему вызывает размещение файла в общей папке. Я думал о том, чтобы сделать файл принадлежащим группе apache, но я не являюсь ее членом. Было бы неплохо, если бы я мог поместить файл в свой личный каталог, но понятно, что я получаю ошибку доступа при попытке записи в файл в нем. Что мне делать?

Для многих пакетов требуются подкаталоги, доступные для программ / сценариев, в html или публичной иерархии.

Поскольку вы (я полагаю) работаете в общей службе с использованием suPHP или эквивалента, скрипты будут запускаться только в UID владельца, поэтому это недоступно. Я принял очень простое соглашение: если имя любого файла или папки начинается с _ или. тогда доступ через URI запрещен. Это простое правило, которое я помещаю в любой .htaccess файл с

SetEnvIf Request_URI "(^_|/_|^\.|/\.)" forbidden
<Files *>
     Order allow,deny
     Allow from all
     Deny from env=forbidden
</Files> 

Другой способ сделать это - использовать RewriteRule:

RewriteRule (^_|/_|^\.|/\.)            -                  [forbidden]

Это имеет то преимущество, что вы можете принять это чрезвычайно простое соглашение для любых каталогов include или данных, к которым вы, возможно, захотите получить доступ в своих сценариях, но сделайте это. не хотите, чтобы их можно было просматривать через URI.

Сноска

Я немного смущен вашим утверждением:

Было бы неплохо, если бы я мог поместить файл в свой личный каталог, но понятно, что я получаю ошибку доступа при попытке записи в файл в нем.

Это одна из тех забав, где UID поставщика услуг принадлежит / home / private /, а у вас есть доступ только для чтения через свой GID? Мой интернет-провайдер делает то же самое для сброса файлов журналов. Я могу читать, но не могу писать или удалять. Вот почему я использую /public/_private. Простите за оксюморон.