#apache #.htaccess #security #mod-rewrite
#apache #.htaccess #Безопасность #mod-перезапись
Вопрос:
В данном веб-приложении PHP mod_rewrite часто используется для упрощения URL-адресов и упрощения предоставления PHP желаемого содержимого. Но, с другой стороны, это может открыть возможности для попыток взлома, особенно если оно написано кем-то (например, мной), относительно новым для mod_rewrite. Рассмотрим простой пример, не код, а само преобразование, используя mod_rewrite в файле .htaccess для чтения данных агента пользователя и добавления их в URL в качестве GET data:
Пользователи Safari: example.com/page -> example.com/page?browser=safari
Пользователи Chrome: example.com/page -> example.com/page?browser=chrome
Пользователи IE: example.com/page -> example.com/page?browser=ie
Если пользователь Internet Explorer хочет просмотреть версию Chrome, он или она может отправить запрос на страницу, на которой уже есть данные GET, которые будут обновлены следующим образом:
Хакер:
example.com/page?browser=chrome -> example.com/page?browser=chrome?browser=ie
Конечно, это надуманный пример, но идея все еще существует. Если у вас есть mod_rewrite, сначала удалите все данные GET, не сломается ли это позже? Что еще более важно, можно ли разрешать ПОЛУЧЕНИЕ данных из определенных источников (например, приложения сайта), но не из других (например, браузера, wget, curl или чего-то подобного)?
Ответ №1:
Чтобы удалить все строки запроса, предоставленные браузером (клиентом), вы можете использовать это правило в своем root .htaccess:
RewriteEngine On
RewriteCond %{HTTP_REFERER} !^http://(www.)?domain.com/ [NC]
RewriteCond %{THE_REQUEST} s/ ([^?] )? [NC]
RewriteRule ^ /%1? [R=302,L]
PS: Благодаря использованию %{THE_REQUEST}
этого, параметры запроса будут добавляться внутренне другими правилами перезаписи, не использующими R
флаг.
Комментарии:
1. Как насчет выборочного удаления запросов, например, разрешения запросов из приложения, но не из браузера или инструмента командной строки?
2. Это просто заблокирует строки запроса из браузера или инструментов командной строки
3. Я понял это, но что, если иногда я хочу, чтобы строки запроса были разрешены? Например, если бы я создал мобильное приложение для своего сайта и использовал правильный формат запроса сайта в этом приложении, мне вообще не нужно было бы mod_rewrite URL. Но это только в том случае, если запрос делал мое собственное приложение. Может ли .htaccess mod_rewrite каким-то образом использовать это как условие перезаписи?
4. хорошо, проверьте обновленный ответ, чтобы проверить на основе
%{HTTP_REFERER}
. Заменитеdomain.com
на ваш фактический домен. Но имейте в виду%{HTTP_REFERER}
, что его также можно настроить на стороне клиента.5. Есть ли что-нибудь менее поддающееся взлому?