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

Общая незащищенность установки PHP?

Я работаю с системным администратором в университете и просто наткнулся на что-то, что, вероятно, является обычным, но было для меня настоящим шоком.

Все каталоги public_html и веб-области хранятся в afs с разрешениями на чтение для веб-серверов. Поскольку пользователям разрешено иметь скрипты php в своем public_html, это означает, что они могут получать доступ к файлам друг друга изнутри php (и основных веб-файлов!).

Это не только делает любую защиту паролем .htaccess совершенно бесполезной, но также позволяет пользователям читать исходные файлы php, содержащие пароли базы данных mysql и аналогичную конфиденциальную информацию. Или, если они обнаружат, что у других людей есть каталоги, в которых веб-серверы имеют доступ на запись (например, для личных журналов или для сохранения отправленных данных формы), они могут хранить файлы в этих учетных записях.

Простой пример:

<?
  header("Content-type: text/plain");
  print file_get_contents("/afs/example.com/home/smith/public_html/.htpasswd"); 
?>

Это общая проблема? И как вы обычно это решаете?

ОБНОВИТЬ:

Спасибо за вклад. К сожалению, кажется, что нет простого ответа. В такой большой общей среде, как эта, пользователям, вероятно, не следует предоставлять такой большой выбор. Лучший подход, который я могу придумать, - установить open_basedir в основной конфигурации для всех каталогов public_html, запустить suphp и разрешить только чистый php (без сценариев cgi, запуск внешних команд с обратными кавычками и т. Д.).

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

Можно использовать suphp, который запускает скрипт php с uid его владельца.

http://www.suphp.org

Я предлагаю ограничить доступ PHP к файлам (через open_basedir & аналогичные директивы для каждого виртуального хоста): вы хотите, чтобы пользователи могли открывать / читать / записывать файлы в своем корневом веб-каталоге и, возможно, на один уровень выше (для рабочего места), но не в каталоге, в котором они будут хранить например htpasswd файлы.

Структура каталогов, например:

/Client
    /auth
    /site
        /www_root
        /www_tmp

Соответствует этому требованию: open_basedir можно указать на /Client/site безопасно, и htpasswd файлы хранятся в /Client/auth (с участием .htaccess файлы или httpd.conf изменен, чтобы вместо этого указывать на соответствующее место).
Это не позволяет вашим клиентам открывать чужие файлы, И, в качестве преимущества, злоумышленники не могут читать файлы в /Client/auth (или что-нибудь еще в вашей системе, например /etc/passwd :-)

Видеть http://php.net/manual/en/ini.core.php для получения дополнительной информации о реализации open_basedir и per-vhost.

Нет, это не обычная проблема, потому что большинство общих хостов определяют конфигурацию open_basedir в файле htaccess в каталоге public_html каждого пользователя (или в vhost, если у каждого пользователя есть свой собственный vhost).

например файла .htaccess:

# Assuming these are not set globally - its good practice to limit:
  php_flag magic_quotes_gpc off
  php_flag magic_quotes_runtime off
  php_flag register_globals off
  php_flag short_open_tag off
  php_value max_execution_time 60

# These set the user-specific paths
  php_value open_basedir /afs/example.com/home/smith:/usr/share/php/include
  php_value session.save_path /afs/example.com/home/smith/tmp
  php_value upload_tmp_dir /afs/example.com/home/smith/tmp

Но убедитесь, что вы установили правильные разрешения для файла .htaccess, чтобы предотвратить изменение пользователем open_basedir (если они попытаются переопределить его в subdir / .htaccess, это не должно работать - но вам, вероятно, следует проверить это, чтобы убедиться) .

HTH

С.

AFS игнорирует простые разрешения пользователей unix. suPHP выполняет setuid перед запуском программы php, но это не дает процессу токены kerberos, необходимые для доступа к AFS, и ограничивать его разрешениями. suPHP необходимо каким-либо образом изменить, чтобы получить эти токены, прежде чем он сможет представить себя системе AFS как этот пользователь. Насколько мне известно, этого не было сделано. (Фактически, я нашел этот вопрос, когда смотрел, делал ли это кто-нибудь еще.)