nginx-0.1.29

Igor Sysoev is at rambler-co.ru
Fri May 13 15:31:39 MSD 2005


On Fri, 13 May 2005, Igor Sysoev wrote:

> On Fri, 13 May 2005, Zherdev Anatoly wrote:
>
>> On Thu, 12 May 2005 22:09:08 +0400 (MSD)
>> Igor Sysoev <is at rambler-co.ru> wrote:
>> 
>>> On Thu, 12 May 2005, Михаил Монашёв wrote:
>>> 
>>>> IS>      *) Изменение: nginx теперь передаёт неверные строки в
>> заголовках
>>>> IS>         запроса клиента и ответа бэкенда.
>>>> 
>>>> Мне nginx нравился тем, что блокировал странные запросы и не пускал
>> их
>>>> дальше  к  бэкенду,  от чего последнему могло поплохеть. Сейчас
>> как-то
>>>> можно включить эту опцию обратно?
>>> 
>>> Сейчас - нет, но можно добавить параметр.
>> 
>> Это будет хорошо. Только хочется иметь его довольно гибким. Мне например
>> совершенно не нужно блокировать "кривые" хедеры которые передает бакенд,
>> но вот от клиента к бакенду передавать кривости совсем не хочется.
>> 
>> То есть клиент->сервер фильтровать надо, а сервер->клиент не надо.
>
> Да, предполагается фильтровать только от клиента. Настраиваться будет
> на уровне сервера, но нужно понимать, что сервер в данном контексте
> означает ip-based, а не name-based.

А вот и патч. Директива ignore_invalid_headers [on|off], по умолчанию
заголовки игнорируются (on). В состоянии off заголовки передаются бэкенду.


Игорь Сысоев
http://sysoev.ru
-------------- next part --------------
--- src/http/ngx_http_core_module.c	Sat Apr 30 13:48:14 2005
+++ src/http/ngx_http_core_module.c	Fri May 13 13:26:28 2005
@@ -144,6 +144,13 @@
       offsetof(ngx_http_core_srv_conf_t, restrict_host_names),
       &ngx_http_restrict_host_names },
 
+    { ngx_string("ignore_invalid_headers"),
+      NGX_HTTP_MAIN_CONF|NGX_HTTP_SRV_CONF|NGX_CONF_TAKE1,
+      ngx_conf_set_flag_slot,
+      NGX_HTTP_SRV_CONF_OFFSET,
+      offsetof(ngx_http_core_srv_conf_t, ignore_invalid_headers),
+      NULL },
+
     { ngx_string("location"),
       NGX_HTTP_SRV_CONF|NGX_HTTP_LOC_CONF|NGX_CONF_BLOCK|NGX_CONF_TAKE12,
       ngx_http_core_location,
@@ -1578,6 +1588,7 @@
     cscf->client_header_timeout = NGX_CONF_UNSET_MSEC;
     cscf->client_header_buffer_size = NGX_CONF_UNSET_SIZE;
     cscf->restrict_host_names = NGX_CONF_UNSET_UINT;
+    cscf->ignore_invalid_headers = NGX_CONF_UNSET;
 
     return cscf;
 }
@@ -1662,6 +1673,9 @@
 
     ngx_conf_merge_unsigned_value(conf->restrict_host_names,
                               prev->restrict_host_names, 0);
+
+    ngx_conf_merge_value(conf->ignore_invalid_headers,
+                              prev->ignore_invalid_headers, 1);
 
     return NGX_CONF_OK;
 }
--- src/http/ngx_http_core_module.h	Fri Apr 22 23:02:01 2005
+++ src/http/ngx_http_core_module.h	Fri May 13 13:22:57 2005
@@ -87,6 +87,8 @@
     ngx_msec_t                 client_header_timeout;
 
     ngx_uint_t                 restrict_host_names;
+
+    ngx_flag_t                 ignore_invalid_headers;
 } ngx_http_core_srv_conf_t;
 
 
--- src/http/ngx_http_parse.c	Mon May  2 23:49:06 2005
+++ src/http/ngx_http_parse.c	Fri May 13 13:02:47 2005
@@ -529,6 +529,8 @@
 
         /* first char */
         case sw_start:
+            r->invalid_header = 0;
+
             switch (ch) {
             case CR:
                 r->header_end = p;
@@ -552,6 +554,8 @@
                     break;
                 }
 
+                r->invalid_header = 1;
+
                 break;
 
             }
@@ -605,6 +609,8 @@
                 state = sw_ignore_line;
                 break;
             }
+
+            r->invalid_header = 1;
 
             break;
 
--- src/http/ngx_http_request.c	Wed May  4 12:08:43 2005
+++ src/http/ngx_http_request.c	Fri May 13 13:42:48 2005
@@ -725,6 +725,7 @@
     ngx_connection_t           *c;
     ngx_http_header_t          *hh;
     ngx_http_request_t         *r;
+    ngx_http_core_srv_conf_t   *cscf;
     ngx_http_core_main_conf_t  *cmcf;
 
     c = rev->data;
@@ -742,6 +743,7 @@
     }
 
     cmcf = ngx_http_get_module_main_conf(r, ngx_http_core_module);
+    cscf = ngx_http_get_module_srv_conf(r, ngx_http_core_module);
     hh = (ngx_http_header_t *) cmcf->headers_in_hash.buckets;
 
     rc = NGX_AGAIN;
@@ -783,8 +785,7 @@
 
         if (rc == NGX_OK) {
 
-#if 0
-            if (r->invalid_header) {
+            if (r->invalid_header && cscf->ignore_invalid_headers) {
 
                 /* there was error while a header line parsing */
 
@@ -796,7 +797,6 @@
                               &header);
                 continue;
             }
-#endif
 
             /* a header line has been parsed successfully */
 
--- src/http/ngx_http_request.h	Mon May  2 23:41:21 2005
+++ src/http/ngx_http_request.h	Fri May 13 12:16:38 2005
@@ -336,6 +337,8 @@
 
     /* URI with "\0" or "%00" */
     unsigned                          zero_in_uri:1;
+
+    unsigned                          invalid_header:1;
 
     unsigned                          valid_location:1;
     unsigned                          valid_unparsed_uri:1;


More information about the nginx-ru mailing list