• <ins id="pjuwb"></ins>
    <blockquote id="pjuwb"><pre id="pjuwb"></pre></blockquote>
    <noscript id="pjuwb"></noscript>
          <sup id="pjuwb"><pre id="pjuwb"></pre></sup>
            <dd id="pjuwb"></dd>
            <abbr id="pjuwb"></abbr>

            woaidongmao

            文章均收錄自他人博客,但不喜標(biāo)題前加-[轉(zhuǎn)貼],因其丑陋,見(jiàn)諒!~
            隨筆 - 1469, 文章 - 0, 評(píng)論 - 661, 引用 - 0
            數(shù)據(jù)加載中……

            nginx fastcgi模塊的一個(gè)bug

            原創(chuàng)文章,轉(zhuǎn)載請(qǐng)注明: 轉(zhuǎn)載自pagefault

            本文鏈接地址: nginx fastcgi模塊的一個(gè)bug

            上周服務(wù)器更新到nginx0.8.X之后,nginx出現(xiàn)了core dump的情況,而在0.7.X并不會(huì)出現(xiàn),通過(guò)察看core dump文件以及nginx 0.8.x0.7.x的比較,發(fā)現(xiàn)core dumpnginx 0.8.40引入下面這個(gè)feature才導(dǎo)致的:

            *) Feature: a “fastcgi_param” directive with value starting with
            “HTTP_” overrides a client request header line.

            nginx 0.8.40之后,如果你的fastcgi_param定義的變量以HTTP_開(kāi)頭,則傳遞給后端的頭會(huì)忽略request header中的這個(gè)頭,比如定義了一個(gè) fastcgi_param $HTTP_HOST test, 那么傳遞給后端時(shí),host這個(gè)頭的值就是test.

            這里的邏輯是這樣子的,當(dāng)nginx創(chuàng)建一個(gè)fastcgi request的時(shí)候,會(huì)先計(jì)算所需要的長(zhǎng)度,首先是計(jì)算header的長(zhǎng)度,在計(jì)算之前會(huì)先分配一個(gè)ignored數(shù)組(用來(lái)保存將要被忽略的頭),它的大小是配置文件中fastcgi_param定義的以HTTP_開(kāi)頭的變量的個(gè)數(shù). 然后遍歷所有的request header,如果發(fā)現(xiàn)header的名字和fastcgi_param中定義的變量的(HTTP_開(kāi)頭)名字相同(使用hash),則將這個(gè)header指針?lè)诺?span lang="EN-US">ignored數(shù)組中,最后在拷貝request header的時(shí)候直接在這個(gè)數(shù)組里面查找,如果有則跳過(guò),否則拷貝頭以及它的值。

            看起來(lái)沒(méi)什么問(wèn)題,可是這里忽略了request header有可能會(huì)有重復(fù)的這個(gè)情況,此時(shí)ignored數(shù)組可能就會(huì)越界,從而導(dǎo)致core dump.


            來(lái)看對(duì)應(yīng)的代碼,引起問(wèn)題的代碼是下面這段(ngx_http_fastcgi_create_request).

            1

            2

            3

            4

            5

            6

            7

            8

            9

            10

            11

            12

            13

            14

            15

            16

            17

            18

            19

            20

            21

            22

            23

            24

            25

            26

            27

            28

            29

            30

            31

            32

            33

            34

            35

            36

            37

            38

            //這里header_params就是fastcgi_param中定義的變量的(HTTP_開(kāi)頭)個(gè)數(shù)

                    if (flcf->header_params) {

            //分配內(nèi)存

                        ignored = ngx_palloc(r->pool, flcf->header_params * sizeof(void *));

                        if (ignored == NULL) {

                            return NGX_ERROR;

                        }

                    }

              

                    part = &r->headers_in.headers.part;

                    header = part->elts;

            //開(kāi)始遍歷

                    for (i = 0; /* void */; i++) {

              

                        if (i >= part->nelts) {

                            if (part->next == NULL) {

                                break;

                            }

              

                            part = part->next;

                            header = part->elts;

                            i = 0;

                        }

              

                        if (flcf->header_params) {

                     ..............................................................

            //headers_hash就是fastcgi_param中定義的變量(HTTP_開(kāi)頭)名字的hash

                            if (ngx_hash_find(&flcf->headers_hash, hash, lowcase_key, n)) {

            //可以看到只要找到相同的hash,則header_params就會(huì)加一.而如果重復(fù)的頭大于fastcgi_param中定義的變量的(HTTP_開(kāi)頭)的個(gè)數(shù),則ignored肯定會(huì)越界.

                                ignored[header_params++] = &header[i];

                                continue;

                            }

              

                            n += sizeof("HTTP_") - 1;

              

                        } else {

                            n = sizeof("HTTP_") - 1 + header[i].key.len;

                        }

            舉個(gè)例子,配置文件里面包含下面的命令:
            fastcgi_param HTTP_HOST $http_host;

            然后客戶端傳過(guò)來(lái)的頭中如果包含多個(gè)host頭,則nginx就會(huì)core dump.

             

            posted on 2011-06-21 10:57 肥仔 閱讀(433) 評(píng)論(0)  編輯 收藏 引用 所屬分類(lèi): Web-后臺(tái)

            久久精品国产亚洲AV蜜臀色欲| 亚洲人成无码网站久久99热国产| 国产精品久久久久久久app| 久久久久久国产a免费观看黄色大片| 久久精品卫校国产小美女| 国产精品久久久久久| 麻豆久久| 久久99国产精一区二区三区| 久久中文字幕视频、最近更新| 亚洲国产另类久久久精品黑人| yellow中文字幕久久网| 亚洲精品无码专区久久久| 精品人妻伦九区久久AAA片69 | 91精品国产91久久| 久久天天躁夜夜躁狠狠躁2022| 久久综合综合久久狠狠狠97色88 | 国色天香久久久久久久小说| 国产精品久久久久AV福利动漫| 亚洲精品无码久久不卡| 国产精品久久久久久搜索| 看久久久久久a级毛片| 亚洲日本久久久午夜精品| 日本久久久久久中文字幕| 性高湖久久久久久久久| 思思久久99热只有频精品66| 日本精品久久久久影院日本| 久久综合狠狠色综合伊人| 国内精品久久国产大陆| 精品久久人妻av中文字幕| 天天躁日日躁狠狠久久 | 久久久久国产一级毛片高清版| 亚洲AV无码久久精品狠狠爱浪潮 | 精品熟女少妇a∨免费久久| 无码伊人66久久大杳蕉网站谷歌 | 一级女性全黄久久生活片免费 | 亚洲乱码日产精品a级毛片久久 | 无码久久精品国产亚洲Av影片| 久久这里的只有是精品23| 亚洲国产小视频精品久久久三级| 日本精品久久久久影院日本| 热RE99久久精品国产66热|