У меня Apache 2.4 с PHP 5.5.14 установлен на последней версии Debian. В соответствии с советами и приемами безопасности Apache я установил свой httpd.conf следующим образом:
<Directory />
AllowOverride none
Require all denied
</Directory>
<Directory "/var/www">
Options FollowSymLinks
AllowOverride none
Require all granted
</Directory>
Я перезапускаю сервер Apache и запускаю этот PHP-код:
<?php
$filename = "/etc/passwd";
$handle = fopen($filename, "r");
$contents = fread($handle, filesize($filename));
fclose($handle);
echo($contents);
?>
Код получает весь файл / etc / passwd, и я считаю это серьезной проблемой безопасности. Я уже пару дней пытался решить эту проблему, просто читая руководства, но мне пока не повезло. Я бы воспринял толчок в правильном направлении, спасибо.
Но имейте в виду, что open_basedir
просто ограничит доступ к каталогам для функций PHP и т.п., но не для внешних программ, которые выполняются через PHP. Например:
<?php
$file = shell_exec('cat /etc/passwd');
echo $file;
выведет содержимое /etc/passwd
файл без проблем, потому что доступ к файловой системе вызывается не самим PHP, а cat
программа. cat
управляется www-data
пользователь по умолчанию (в Debian), поэтому здесь будут применяться только обычные разрешения на доступ к файлам ОС (т.е. доступ для владельца файла, группы и мира).
Чтобы предотвратить это, вы можете либо
exec()
, passthru()
, system()
, shell_exec()
которые выполняют команды оболочки через disable_functions
в твоем php.ini
, В зависимости от конфигурации Apache / PHP и ваших потребностей disable_functions
вероятно, самый простой в настройке, но он, скорее всего, сломает такие вещи, как ImageMagick и тому подобное, что часто бывает с exec()
(лайк exec('/usr/bin/convert ...')
для ImageMagick).
Я тестировал это в Debian Squeeze с Apache и PHP как mod_php из репозиториев и в Ubuntu 14.04 с Apache и PHP, запущенным через php-fpm, а также с пакетами из репозитория. Возможно, это также применимо к PHP в Windows, но я никогда не пробовал этого ... хотя cat /etc/passwd
не будет работай :-)
Вы можете использовать параметр open_basedir
определено в php.ini. Этот параметр предотвратит доступ сценария PHP к файлу (например, fopen () или включают()) вне каталога, указанного в open_basedir. Видеть эта страница для документации.