ПРОЕКТЫ 


  АРХИВ 


Apache-Talk @lexa.ru 

Inet-Admins @info.east.ru 

Filmscanners @halftone.co.uk 

Security-alerts @yandex-team.ru 

nginx-ru @sysoev.ru 


  СТАТЬИ 


  ПЕРСОНАЛЬНОЕ 


  ПРОГРАММЫ 



ПИШИТЕ
ПИСЬМА












     АРХИВ :: nginx-ru
Nginx-ru mailing list archive (nginx-ru@sysoev.ru)

[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]

Re[3]: referer



On Sun, 27 Mar 2005, Alexey Bestciokov wrote:

да, это вероятно решит большую часть проблем !

Патчик.

IS> Наверное, нужно в придачу к none сделать ещё параметр blocked,
IS> который бы разрешал доступ с реферером, неначинающимся на "http://";.

IS> On Sun, 27 Mar 2005, Alexey Bestciokov wrote:

Игорь, подскажи пожалуйста, а есть возможность проверять реферер, как для
юзер агент ?
что нить вроде if ($HTTP_REFERE ~ site_com) ?

IS> Да. Сейчас поддерживаются все заголовки запроса в форме $HTTP_...
IS> и ещё несколько перемнных: $REMOTE_ADDR, $DOCUMENT_URI и $QUERY_STRING.

IS> Но конкретно реферер лучше проверять с помощью директив

IS>       valid_referers  none  server_names  *.example.com;

IS>       if ($invalid_referer) {
IS>           ...
IS>       }


Игорь Сысоев
http://sysoev.ru
--- src/http/modules/ngx_http_rewrite_module.c  Thu Mar 24 22:59:19 2005
+++ src/http/modules/ngx_http_rewrite_module.c  Sun Mar 27 22:03:13 2005
@@ -36,6 +36,7 @@
     ngx_flag_t                    log;
 
     ngx_flag_t                    no_referer;
+    ngx_flag_t                    blocked_referer;
 } ngx_http_rewrite_loc_conf_t;
 
 
@@ -716,6 +717,7 @@
             e->sp++;
 
             return;
+
         } else {
             e->sp->value = 1;
             e->sp->text.len = 1;
@@ -732,12 +734,22 @@
     if (len < sizeof("http://i.ru";) - 1
         || (ngx_strncasecmp(ref, "http://";, 7) != 0))
     {
-        e->sp->value = 1;
-        e->sp->text.len = 1;
-        e->sp->text.data = (u_char *) "1";
-        e->sp++;
+        if (cf->blocked_referer) {
+            e->sp->value = 0;
+            e->sp->text.len = 0;
+            e->sp->text.data = (u_char *) "0";
+            e->sp++;
 
-        return;
+            return;
+
+        } else {
+            e->sp->value = 1;
+            e->sp->text.len = 1;
+            e->sp->text.data = (u_char *) "1";
+            e->sp++;
+
+            return;
+        }
     }
 
     len -= 7;
@@ -854,6 +866,7 @@
     conf->stack_size = NGX_CONF_UNSET_UINT;
     conf->log = NGX_CONF_UNSET;
     conf->no_referer = NGX_CONF_UNSET;
+    conf->blocked_referer = NGX_CONF_UNSET;
 
     return conf;
 }
@@ -874,12 +887,17 @@
     if (conf->referers == NULL) {
         conf->referers = prev->referers;
         ngx_conf_merge_value(conf->no_referer, prev->no_referer, 0);
+        ngx_conf_merge_value(conf->blocked_referer, prev->blocked_referer, 0);
     }
 
     if (conf->no_referer == NGX_CONF_UNSET) {
         conf->no_referer = 0;
     }
 
+    if (conf->blocked_referer == NGX_CONF_UNSET) {
+        conf->blocked_referer = 0;
+    }
+
     if (conf->codes == NULL) {
         return NGX_CONF_OK;
     }
@@ -1538,6 +1556,11 @@
 
         if (ngx_strcmp(value[i].data, "none") == 0) {
             lcf->no_referer = 1;
+            continue;
+        }
+
+        if (ngx_strcmp(value[i].data, "blocked") == 0) {
+            lcf->blocked_referer = 1;
             continue;
         }
 


 




Copyright © Lexa Software, 1996-2009.