Показать сообщение отдельно

  #4  
Старый 20.01.2007, 16:59
blackybr
♠ ♦ ♣ ♥
Регистрация: 18.05.2006
Сообщений: 1,828
Провел на форуме:
8042357

Репутация: 3742


Отправить сообщение для blackybr с помощью ICQ Отправить сообщение для blackybr с помощью AIM Отправить сообщение для blackybr с помощью Yahoo
По умолчанию

Part 2. Небольшое дополнение.

Пару слов о том, как можно использовать mod rewrite для повышения секурности сайта, ограничения контента, прав доступа и тд и тп (без использования языков web программирования)

Что же еще может mod rewrite? а может он довольно-таки много. Как я уже писал, RewriteCond определяет правила условия, и всегда предшествует RewriteRule. Т.е. RewriteRule в таком случае работает только при верном условии. Rewrite module воспринимает также и сервреные переменные, что не может не радовать ) Вот некоторые из них, которыми приходится довольствоваться довольно-таки часто:

HTTP_USER_AGENT - юзер агент (например Opera/9.10 (Windows NT 5.1; U; ru))
HTTP_REFERER - Реффер (т.е. сайт с которой вы пришли на конечный сайт)
HTTP_COOKIE - передаваемые кукисы =)
HTTP_FORWARDED - адрес пользователя который сейчас на страничке
HTTP_HOST - адрес сайта (без http://)
HTTP_PROXY_CONNECTION - становленно в том случае, если клиент пришел через 'прозрачный' прокси-сервер.
HTTP_ACCEPT - уточнее типа информации (так называемых медиа-типов) принимаемой браузером на данной страничке, например text/plain, text/html, image/gif, image/jpeg)
REMOTE_ADDR - ваш ip
REQUEST_METHOD - метод используемый для выдачи запроса (GET, PUT, POST и тд)
SCRIPT_FILENAME - полный путь к выполняемому скрипту на сервере
PATH_INFO - все что следует за именем скрипта при его вызове
QUERY_STRING - строка запроса


Предположим у нас есть сайт http://site.com
Мы почему-то ужастно не хотим, чтобы кто-то напрямую имел акцесс к какому либо типу файлов, например картинкам jpg, png (ну т.е. только скрипты могли это делать). Можно попробовать сделать это с помощью mod_access, чем-то типа с .htaccess в корне с содержанием:
PHP код:
<FilesMatch "\.(jpg|png)$"
  
Order Deny,Allow 
  Deny from all 
</FilesMatch
Но недостаок в том, что он будет запрещать доступ и вам и скриптам, вызывающие/открывающие картинки. Делаем это с помощью mod_rewrite
PHP код:
Options +FollowSymLinks 
RewriteEngine On 
RewriteCond 
%{HTTP_REFERER} . 
RewriteCond %{HTTP_REFERER} !^http://(www\.)?site\.com(/.*)?$ 
RewriteRule \.(jpg|png)$ 
Первые две строчки понятны. Дальше видим условие - при HTTP_REFERER содержащим site.com (регулярки см. выше) то тогда разрешается просмотр картинки.
Когда это может помоч? Ну например у на есть фотоархив и есть счетчик и мы хотим знать точное кол-во посетителей. Но ведь когда фотка индексируется в поисковике, и человек проходит по ссылке из того же яндекса - в реферере указан сам яндекс и не факт, что ссылка будет не на прямую картинку. Так называемый hot-linking Думаю понятно


Теперь сделаем подобие авторизации.. правда использую опять же Mod_rewrite ..
Т.к. я уже сказал что мы не будем использовать php,perl и тд, то прийдется обойтись и без бд =)

Для этого разберем еще одну директиву мода - RewriteMap, которая используется в правилах замены разными mapping ф-ями к областям переписки с помощью rewriterule через rewritecond..

Авторизацию будем проводить по файлу сессиям в auth.txt который находится вне WWW. Пусть полный путь на сервере к сайту /home/user/www/
Создадим файл /home/user/auth.txt с таким содержимым:
PHP код:
# session  1 
abcdefghijkl  1 
Дальше разберемся что же будет у нас в .htaccess
PHP код:
Options +FollowSymLinks 
RewriteEngine On
RewriteMap sessionids txt
:/home/user/auth.txt

# сессии нет вообще
RewriteCond %{QUERY_STRING} !^(.*&)?sessionid= [NC,OR] 
RewriteCond %{QUERY_STRING} ^(.*&)?sessionid=(&.*)?$ [NC
RewriteRule .* - [F,L

# сессиии нет в файле
RewriteCond %{QUERY_STRING} ^(.*&)?sessionid=([^&]+)(&.*)?$ [NC
RewriteCond ${sessionids:%2|0} ^0
RewriteRule .* - [F,L
или для файла вида (заюзаем более секурную версию - сессия + айпи)
PHP код:
# session-ip  1 
blablbalbalb-127.0.0.1  1 
получим немного по-другому
PHP код:
RewriteCond %{QUERY_STRING} ^(.*&)?sessionid=([^&]+)(&.*)?$ [NC]   
RewriteCond %2-%{REMOTE_ADDR} ^(.+)$   RewriteCond ${sessionids:%1|0} ^0$   
RewriteRule .* - [F,L
Все что тут сделано, я уж описывал. Еще раз повторю -

берем QUERY_STRING (Т.е. строку запроса), и проверяем ее на наличие сессии черех txt файл (с тем же результаом можно сделать через .php файл, который обращается к бд).

RewriteCond%2-%{REMOTE_ADDR} ^(.+)$ - %2 взято из первого RewriteCond, наша сессия
потом переменная сессии и айпи (он у нас тоже есть в .txt файле) заносим в одну переменную - %1


RewriteCond ${sessionids:%1|0} ^0$


${sessionids:%1|0} - проверка по RewriteMap
sessionid - имя самой Rewrite Map

%1 - переменная, о которой сказал выше (сессия + айпи.)

0 - просто дэфолтная переменная


Смысл в том, что если проверка по файлу возвращает положиетльный резуультат и строчка с данными существует для данной Rewite Map, то возвращается 1 (та самая единичка уоторую я ставлю в конце каждой строчки в файле) auth.txt, в противном случае возвращается 0 ( ^0$ обозначает что-то типа "присвоим ему 0" ). Если проверка вообще не осуществилась, то возвращается опять же 0, после чего мод рерайт продолжает свою работу, предвариетльно послав Forbidden ( [F] ).

(ц) blackybr



См. также
http://httpd.apache.org/docs/1.3/mod/mod_rewrite.html
http://en.wikipedia.org/wiki/Rewrite_engine
__________________
Привет! Меня зовут Джордж, и я хотел бы рассказать вам про реинкарнацию (ц) 2x2

Последний раз редактировалось blackybr; 20.01.2007 в 17:04..