El usuario de Apache siempre podrá leer una gran parte del sistema de archivos. Tanto por diseño como por defecto, muchas ubicaciones se dejan legibles (y, a veces, ejecutables )para todos los usuarios. Esto no es, en sí mismo, un problema.
Lo que debe asegurarse es que 1 )Apache no entregará documentos fuera de un conjunto específico de directorios y que 2 )PHP no puede acceder a ningún directorio que no contenga los archivos PHP de su aplicación.
1 )Use las entradas
para limitar el acceso y asegurarse de que no haya valores predeterminados no seguros en ningún archivo de configuración. Esto es un poco tangencial a su pregunta ya que lo que está sirviendo los archivos es PHP, no apache. Pero aún es importante tener en cuenta;
2 )Habilite el modo seguro y configure las directivas doc _root y open _basedir para garantizar que PHP esté restringido a un árbol de directorios en particular, por ejemplo open_basedir="/var/www/htdocs/
. Estas opciones de configuración se pueden establecer en muchos lugares :desde php.ini del sistema a archivos php.ini dedicados de vhost, hasta directivas de apache pasadas al intérprete de php, etc.
Это невозможно. Вы не можете явно «вернуть» рабочий каталог до запуска скрипта. Потому что у скрипта нет разумного способа изменить рабочий каталог вызывающего абонента. См.:Как изменить рабочий каталог запуска оболочки с помощью скрипта? Я игнорирую последнее предложение и продолжаю.
#!/bin/sh
PREFIX="$1"
DIR="$2"
if [ -z "$DIR" ]; then;
ls -d -- "$1"*
else
cd -- "$DIR" &&
ls -d -- "$1"*/
fi
cd --
не является строго необходимым. Проблема, которую он решает, заключается в том, что строка, начинающаяся с -
, может быть интерпретирована как опция команды cd
.
В вопросе говорится, что путь абсолютный, поэтому он всегда будет начинаться с /
и никогда не начинаться с -
. cd "$PATH"
будет достаточно. Однакоls --
является строго необходимым.
Обратите внимание, что каталоги — это тип файла. Форма сценария с двумя аргументами -требуется только для перечисления каталогов. Одна форма аргумента -просто необходима для вывода списка файлов. Помимо каталогов и обычных файлов, к файлам относятся специальные файлы для блочных устройств, символьных устройств, сокетов и именованных каналов (, также известных как «fifo» ).
Linux (и другие реализации )расширяют список типов файлов. Linux включает в себя один, который не является «ни одним из вышеперечисленных», который я видел, когда команда stat
печатает как «странный файл ».
#!/bin/sh
( cd -- "${2:-.}" && ls -d -- "$1"*${2:+/} )
То есть,
cd
в каталог, заданный вторым аргументом, или в .
, если второй аргумент не указан или он пуст. --
запрещает cd
интерпретировать что-либо в $2
как вариант. ls -d
для всех имен, начинающихся с первого аргумента. -d
предотвращает перечисление содержимого любых каталогов с соответствующими именами каталогов. --
запрещает ls
интерпретировать что-либо в $1
как вариант. Если задан второй аргумент, в конце шаблона будет /
и, следовательно, он будет соответствовать только именам каталогов. Все это происходит в подоболочке, так что cd
не меняет рабочий каталог остальной части скрипта (, на что, как я полагаю, намекает последнее предложение ). В любом случае сценарий не сможет изменить рабочий каталог для вызывающей оболочки, если только эта оболочка не использует source
для запуска сценария, а подоболочка не предотвратит этого. Таким образом, рабочий каталог восстанавливается ("возвращается" )к тому состоянию, в котором он был до запуска сценария.