безопасность загрузки файлов, htaccess и изменение расширений

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

Предыстория: у меня есть сайт, который позволяет загружать файлы, но после загрузки их не нужно будет просматривать никому, кроме меня. Я реализовал некоторые меры безопасности, такие как использование сценария загрузки php только для определенных расширений, изменение загруженных файлов на 0644 и использование -ExecCGI для различных расширений в файле htaccess внутри папки загрузок.

Вопросы (их три, вам не повезло):

1) Я бы хотел, чтобы мой файл htaccess переписывал расширения php как что-то еще. Я нашел немного кода для этого, но не могу заставить его работать:

RewriteEngine On
RewriteCond %{REQUEST_METHOD} ^PUT$ [OR]
RewriteCond %{REQUEST_METHOD} ^MOVE$
RewriteRule ^(.*)\.php /site_redone/uploads/$1.nophp

структура сайта выглядит так (по крайней мере, пока я переделываю сайт): mysite.com/site_redone/uploads

Я знаю, что хост моего общего сервера разрешает mod_rewrite. Они используют php 5.2.10. Не уверен, что моя проблема связана с проблемой пути (я еще не совсем понял эту часть), но безрезультатно пробовал различные перестановки путей в части RewriteRule.

2) В настоящее время у меня есть имена файлов, к которым добавляется своего рода отметка времени (time ()), чтобы предотвратить перезапись файлом с тем же именем, поэтому, например, myfile.doc становится myfile1252087685.doc. Я могу сохранить расширение в базе данных MySQL и просто переписать имя файла, чтобы оно заканчивалось на .txt или что-то в моем сценарии загрузки php, но я не уверен, что это приведет к тому же, что и вышеупомянутая попытка mod_rewrite.

3) Есть ли способ поместить файл htaccess в более высокий каталог из папки загрузок, чтобы он не мог перезаписать мой ne'erdowell, пока он находится в папке загрузок? Я хочу, чтобы это повлияло только на папку загрузок, а не на каталог, в котором она находится. Я предполагаю, что это каким-то образом связано с использованием каталога, но я не знаю, как это сделать. Я упоминал, что я новичок в этом?

Заранее спасибо!


person Community    schedule 05.09.2009    source источник


Ответы (2)


Я думаю, что регулярное выражение RewriteRule соответствует всему пути, а не относительно местоположения файла .htaccess. Хотя не уверен в этом.

Итак, вы можете попробовать такое регулярное выражение:

^.*/([^/]*).php$

Или, может быть:

^/site_redone/uploads/([^/]*)\.php$

Я никогда раньше не помещал mod_rewrite RewriteRule в подкаталог, поэтому приведенное выше рекомендуется для вашего верхнего уровня .htaccess

Я не думаю, что <Directory> разрешен в .htaccess, но есть другая аналогичная директива, которая работает. (FilesMatch что ли?)

Подождите ... разве вы не говорили, что хотите запретить веб-доступ ко всей папке? вы можете модифицировать все, что начинается с /site_redone/uploads/, в скрипт php, который отображает страницу ошибки с кодом ошибки HTTP отказано в доступе. Итак, выражение вроде этого: ^/site_redone/uploads/.*$

person JasonWoof    schedule 05.09.2009
comment
Спасибо за быстрый ответ, Джейсон! Из руководств на modrewrite.com мое (правда, шаткое) понимание заключается в том, что регулярное выражение относится к файлу htaccess, но для второй половины RewriteRule требуется весь путь. Но, несмотря на это, ваше регулярное выражение и похожие вариации, которые я пробовал, мне не нравятся. Ну что ж. Меня меньше беспокоят люди, просматривающие папку, чем загрузку вредоносного кода, но мой текущий файл htaccess должен препятствовать общедоступному просмотру и выполнению кода. Я просто не так хорошо разбираюсь в вопросах безопасности, как, наверное, следовало бы, поэтому я пытаюсь охватить все свои вопросы. - person ; 05.09.2009

Что ж, похоже, то, что я пытался сделать, на самом деле невозможно, по крайней мере, так, как я пытался это сделать. Я получил некоторую помощь на форуме modrewrite.com, который сообщил мне, что, поскольку я использую загрузку файлов через html-форму, приведенное выше правило перезаписи не сможет воздействовать на имя файла. Этот фрагмент кода, приведенный выше, может быть, цитирую, «WebDAV или ему подобным, который больше похож на FTP». Мне придется придерживаться php, чтобы отсеять нежелательное. В любом случае, надеюсь, что это кому-то поможет!

person Community    schedule 07.09.2009