web-dev-qa-db-ja.com

同じサイトのCookie属性によるCSRFの防止

私はウェブをサーフィンしていて、記事 同じサイトのcookie属性でCSRFを防ぐ を見つけました。

リンクの維持と同様に、Set-Cookieヘッダーを追加する必要があります。

Set-Cookie:key = value; HttpOnly; SameSite = strict

私の質問は、ASP.NETサイトのすべてのCookieと認証Cookieにこれを設定することです。 IISからのヘッダーを使用してこれを設定しようとしましたが、これは間違った方法の実装であると誰かが言っています。

以下も試しました。

HttpCookie newAuthenticationCookie = new HttpCookie(FormsAuthentication.FormsCookieName
                    , FormsAuthentication.Encrypt(newAuthenticationTicket))
                {
                    HttpOnly = true
                };
newAuthenticationCookie.Values.Add("SameSite", "strict");

しかし、それは私を助けていないようです。

これを行うためのより良い方法を私に提案してください。

ありがとう。

38
imlim

HttpCookie Source を詳細に確認した後、Cookieに追加の属性を追加する方法がなく、クラスが封印済みとしてマークされているため、これをコードで実行できないことが確認されました。

しかし、とにかく、以下のようにweb.configを変更してソリューションを管理します。

<rewrite>
  <outboundRules>
    <rule name="Add SameSite" preCondition="No SameSite">
      <match serverVariable="RESPONSE_Set_Cookie" pattern=".*" negate="false" />
      <action type="Rewrite" value="{R:0}; SameSite=strict" />
      <conditions>
      </conditions>
    </rule>
    <preConditions>
      <preCondition name="No SameSite">
        <add input="{RESPONSE_Set_Cookie}" pattern="." />
        <add input="{RESPONSE_Set_Cookie}" pattern="; SameSite=strict" negate="true" />
      </preCondition>
    </preConditions>
  </outboundRules>
</rewrite>

これにより、各Set-CookieSameSite = strictが追加されます。

45
imlim

Cookieを作成するときにコードでこれを設定することもできます。

var httpCookie = new HttpCookie("mycookie", "myvalue");
httpCookie.Path += ";SameSite=Strict";

Response.SetCookie(httpCookie);

これにより、次のヘッダーが表示されます。

Set-Cookie:mycookie=myvalue; path=/;SameSite=Strict

フレームワークにプッシュされるまで少しハック。

21
Kevin Smith

ここと他の場所にあるすべての情報を体系化するために私の答えを追加するだけです。

1. 4.7.2以降でカスタムCookieを保護する

var c = new HttpCookie("test");
c.SameSite = SameSiteMode.Lax;

2.フォーム認証Cookieを保護するには

Web.config

<authentication mode="Forms">
    <forms ..... cookieSameSite="Lax" />
</authentication>

3. ASP.NETセッションCookieを保護する

Global.asax

void Session_Start(Object sender, EventArgs e)
{
    Response.Cookies["ASP.NET_SessionId"].SameSite = SameSiteMode.Lax;
    //while we're at it lets also make it secure
    if (Request.IsSecureConnection)
        Response.Cookies["ASP.NET_SessionId"].Secure = true;
}

おもしろいこと:<httpCookies requireSSL="true" />を設定しても、何らかの理由でASP.NETセッションCookieは安全ではありません

PDATE 01.2020:.NET 4.8セッションCookieがデフォルトで「SameSite」になりました

最新のWindows Updateをインストールすると、セッションCookieがLaxになります。

4. <httpCookies samesite=xxx>は存在しません

上記のコメントで提案されているように<httpCookies sameSite="Strict" />をweb.configに追加しても機能せず、エラーが発生しました。

認識されない属性「samesite」

4.7.2を対象としていますが。複数のプロジェクトと複数のマシンでテストされ、VS2019はこれをインテリセンスで表示せず、MSドキュメントはどこにも言及していません。

19
Alex

.NET 4.7.2には、SameSiteプロパティのサポートが組み込まれています。
HttpCookieSameSiteというプロパティが追加されました。
詳細情報を参照 ここ マイクロソフトから。

設定ファイルを通じてこれをハッキングする必要はもうありません。

14
tif

SameSiteをASP.NET_SessionId Cookieに定義するには、system.webセクションの下にweb.configを設定する必要がありました。

<sessionState cookieSameSite="Lax" />
10
Andre RB

この時代には、同じ愚かなwebapi cookieバグを修正するためにowinを使用しているため...

public class CookieSameSiteMiddleware : OwinMiddleware
{
    public CookieSameSiteMiddleware(OwinMiddleware next) : base(next)
    {
    }

    public override async Task Invoke(IOwinContext context)
    {
        var url = context.Request.Path.Value.ToLowerInvariant();

        if (url.Contains("/api/mylogin"))
        {
            context.Response.OnSendingHeaders(x =>
            {
                var scv = context.Response.Headers.FirstOrDefault(h => h.Key == "Set-Cookie");
                if (!scv.Equals(default(KeyValuePair<string, string[]>)))
                {
                    //context.Response.Headers.Remove("Set-Cookie");
                    context.Response.Headers.Set("Set-Cookie", scv.Value[0] + "; SameSite=strict");
                }

            }, null);
        }

        await this.Next.Invoke(context);
    }
}

.UseWebApi()の前にミドルウェアが登録されていることを確認してください

8
maxfridbe

4.7.2より前のバージョンでは、Cookieパスに文字列を追加するだけで済みます。

FormsAuthentication.SetAuthCookie(username, false, FormsAuthentication.FormsCookiePath + "; SameSite=Lax");
4
Jacob

https://www.nuget.org/packages/Microsoft.Owin.Security.Cookies/4.1. がSameSiteをサポートするようになりました。

ここでの他のソリューションがうまく機能しないため、これは非常に良いニュースです。

OwinMiddlewareの実装:パフォーマンスを除いて、うまく機能します。これは私たちの環境に固有のものかもしれませんが、そのソリューションは私たちのCPUの約10%でした。

<outboundRules>:おそらく動作する可能性があります。ただし、これまでに確認してテストしたすべてのソリューション(このスレッドのソリューションを含む)では、同じ応答に複数のCookieが設定されていると、いくつかの問題が発生しました。

0
Mikael Eliasson