5

ISAPI フィルターで複数の Cookie を設定する際に問題が発生しました。HttpOnlyすべての Cookie にフラグを追加したい。

したがって、最初の試みでは、Cookie の値を分割してHttpOnlyフラグを追加し、それらを 1 つの文字列に結合してpResponse->SetHeader(pfc, "Set-Cookie:", szNewValue)、最後に呼び出すと、ブラウザーは最初の Cookie 値のみを取得します。

最初の試行のコード:

cbValue = sizeof(szValue) / sizeof(szValue[0]);
        if (pResponse->GetHeader(pfc, "Set-Cookie:", szValue, &cbValue))
        {
            char szNewValue[MAX_URI_SIZE] = "";
            char* token = NULL;
            char* context = NULL;
            char delim[] = ",";

            // szValue format like 
            // "Language=en; expires=Sat, 15-Jul-2113 02:46:27 GMT; path=/; HttpOnly,Language=en; expires=Sat, 15-Jul-2113 02:46:27 GMT; path=/; HttpOnly"
            // After first split
            // token = "Language=en; expires=Sat"
            // context = " 15-Jul-2113 02:46:27 GMT; path=/; HttpOnly,Language=en; expires=Sat, 15-Jul-2113 02:46:27 GMT; path=/; HttpOnly"
            token = strtok_s(szValue, delim, &context);
            while (token != NULL)
            {
                strcat_s(szNewValue, token);
                if (NULL != context)
                {
                    if (' ' != context[0] && !strstr(token, "HttpOnly"))
                    {
                        strcat_s(szNewValue, "; HttpOnly");
                    }

                    // context[0] = ' ' means it split the one whole cookie, not an entire cookie, we need append ","
                    // context[0] != '\0' means other cookies after, we need append delimiter ","
                    if (' ' == context[0] || '\0' != context[0])
                    {
                        strcat_s(szNewValue, ",");
                    }
                }
                // NULL, function just re-uses the context after the first read.
                token = strtok_s(NULL, delim, &context);
            }
            if (!pResponse->SetHeader(pfc, "Set-Cookie:", szNewValue))
            {
                // Fail securely - send no cookie!
                pResponse->SetHeader(pfc,"Set-Cookie:","");
            }

2 回目の試行では、Cookie の値を分割し、すべての Cookie に対して呼び出しますpResponse->SetHeader(pfc, "Set-Cookie:", szNewValue)が、この場合、ブラウザーは最後の Cookie しか取得しません。

2 回目の試行のコード:

cbValue = sizeof(szValue) / sizeof(szValue[0]);
        if (pResponse->GetHeader(pfc, "Set-Cookie:", szValue, &cbValue))
        {
            char szNewValue[MAX_URI_SIZE] = "";
            char* token = NULL;
            char* context = NULL;
            char delim[] = ",";

            // szValue format like 
            // "Language=en; expires=Sat, 15-Jul-2113 02:46:27 GMT; path=/; HttpOnly,Language=en; expires=Sat, 15-Jul-2113 02:46:27 GMT; path=/; HttpOnly"
            // After first split
            // token = "Language=en; expires=Sat"
            // context = " 15-Jul-2113 02:46:27 GMT; path=/; HttpOnly,Language=en; expires=Sat, 15-Jul-2113 02:46:27 GMT; path=/; HttpOnly"
            token = strtok_s(szValue, delim, &context);
            while (token != NULL)
            {
                strcat_s(szNewValue, token);
                if (NULL != context)
                {
                    if (' ' != context[0] && !strstr(token, "HttpOnly"))
                    {
                        strcat_s(szNewValue, "; HttpOnly");
                    }

                    // context[0] = ' ' means it split the one whole cookie, not an entire cookie, we need append ","
                    // context[0] != '\0' means other cookies after, we need append delimiter ","
                    if (' ' == context[0])// || '\0' != context[0])
                    {
                        strcat_s(szNewValue, ",");
                    }
                    if (' ' != context[0])
                    {
                        pResponse->SetHeader(pfc, "Set-Cookie:", szNewValue);
                        strcpy(szNewValue, "");
                    }
                }
                // NULL, function just re-uses the context after the first read.
                token = strtok_s(NULL, delim, &context);
            }

私はIE10 + Win2008 R2でこれを行います。どちらの場合も、結果の Cookie 文字列は正しい形式です。誰もこれについて手がかりを持っていますか?

この問題は基本的に、 を呼び出すGetHeaderと、すべての Cookie をカンマ区切りの 1 つの文字列で受け取るために発生します。SetHeaderメソッドを使用してすべての Cookie を応答に戻す最良の方法は何でしょうか?

4

3 に答える 3

2

同じ問題があり、この問題を解決するには Microsoft に連絡する必要がありました。複数の Cookie を受け取る場合、すべての Cookie がコンマで区切られた完全な文字列を受け取ります。この作業は、各 Cookie を分離し、それぞれに対して SetHeader メソッドを個別に呼び出すことで構成されます。

重要なことは、各 Cookie が一意の名前と値のペア ( http://www.quirksmode.org/js/cookies.html ) を持っている必要があるため、各変更が適切にマッピングされることです。

疑似コードでの解決策

pResponse->GetHeader(pfc, "Set-Cookie:", szValue, &cbValue)

// split cookies here

foreach separated cookie
    pResponse->SetHeader(pfc, "Set-Cookie:", oneCookie)

そうすれば、再度追加するためにすべての Cookie を消去する必要はありません。

于 2013-11-19T19:35:06.803 に答える