Отключите все CGI (php, perl,...) для каталога, используя .htaccess
У меня есть каталог, в котором пользователи могут загружать файлы.
Чтобы избежать проблем с безопасностью (например, кто-то загружает вредоносный php script), я в настоящее время изменяю расширение файлов, добавляя, например, .data
, но затем при загрузке файла им необходимо вручную удалить .data
.
Другим распространенным решением является загрузка файлов в каталог, который не обслуживается Apache, и иметь php script управлять всеми загрузками, вызывая readfile()
.
Я бы хотел просто запретить выполнение любых сценариев (php, perl, cgi-скриптов, что бы я ни установил в будущем) в папке для загрузки. Этот ответ SO предлагает добавить следующую строку в файл .htaccess
в этой папке:
SetHandler default-handler
Однако в моем случае это не имеет никакого эффекта (пример php script, который я помещаю в эту папку, все еще выполняется). Что я делаю неправильно?
Конфигурация Apache
Аппарат VPS (Virtual Private Server) работает под управлением Debian GNU/Linux 6.0.7 (squeeze)
, и насколько я помню (я записываю все команды, которые я запускаю на этом сервере, поэтому моя "память" должна быть довольно точной), я dindn "ничего не измените в конфигурации apache2, appart из запуска sudo apt-get install php5
и создайте файл /etc/apache2/sites-enabled/mysite.com
со следующим содержимым:
<VirtualHost *:80>
ServerAdmin [email protected]
ServerName mysite.com
ServerAlias www.mysite.com
DocumentRoot /home/me/www/mysite.com/www/
<Directory />
Options FollowSymLinks
AllowOverride All
</Directory>
<Directory /home/me/www/mysite.com/www/>
Options Indexes FollowSymLinks MultiViews
AllowOverride All
Order allow,deny
allow from All
</Directory>
ErrorLog ${APACHE_LOG_DIR}/error.log
# Possible values include: debug, info, notice, warn, error, crit,
# alert, emerg.
LogLevel warn
CustomLog ${APACHE_LOG_DIR}/access.log combined
</VirtualHost>
Ответы
Ответ 1
Поместите это в свой .htaccess
:
<Files *>
# @mivk mentionned in the comments that this may break
# directory indexes generated by Options +Indexes.
SetHandler default-handler
</Files>
Но у этого есть несколько дыр в безопасности: можно загрузить .htaccess в подкаталог и переопределить эти параметры, и они также могут перезаписать файл .htaccess!
Если вы параноидально, что поведение параметра должно измениться в будущем, поместите это в свой /etc/apache2/sites-enabled/mysite.com
<Directory /home/me/www/upload/>
# Important for security, prevents someone from
# uploading a malicious .htaccess
AllowOverride None
SetHandler none
SetHandler default-handler
Options -ExecCGI
php_flag engine off
RemoveHandler .cgi .php .php3 .php4 .php5 .phtml .pl .py .pyc .pyo
<Files *>
AllowOverride None
SetHandler none
SetHandler default-handler
Options -ExecCGI
php_flag engine off
RemoveHandler .cgi .php .php3 .php4 .php5 .phtml .pl .py .pyc .pyo
</Files>
</Directory>
Если вы не можете изменить конфигурацию apache, поместите файлы в .htaccess
со следующей структурой каталогов:
/home/me/www/
|- myuploadscript.php
|- protected/
|- .htaccess
|- upload/
|- Uploaded files go here
Таким образом, никто не сможет перезаписать ваш файл .../protected/.htaccess
, так как их загрузки идут в подкаталог .../protected
, а не в protected
.
AFAICT, вы должны быть в безопасности.
Ответ 2
My Godaddy setup не позволит мне редактировать файлы httpd.conf, а команда php_flag не работает из-за того, как они реализовали php для меня.
Я смог использовать это в моем файле .htaccess
:
SetHandler default-handler
AddType text/plain php
Я помещаю это в каталог выше, где разрешен доступ к моему FTP-пользователю, который заставляет все файлы PHP в этом каталоге, а также все подкаталоги, чтобы показать php как обычный текст.
Это будет работать и для других типов файлов. Все, что вам нужно сделать, это добавить еще одну строку с любым расширением файла, который вы хотите отобразить в виде обычного текста. AddType text/plain cgi
например