6

私は自分の会社のウェブサイトのセキュリティを向上させることに取り組んでおり、簡単に維持できる偽造の試みを防ぐトークンを作成したいと考えました。これが私が思いついたものです。

public class AntiForgeryToken
{
    private readonly string _referenceToken;

    public AntiForgeryToken()
    {
        _referenceToken = Guid.NewGuid().ToString();
    }
    public string ReferenceToken
    {
        get { return _referenceToken; }
    }
}

MasterPage の基本クラスには、次の名前のプロパティでラップされた HiddenField があります。ReferenceToken

protected virtual void Page_Load(object sender, EventArgs e)
{
    if (!Page.IsPostBack)
    {
        InjectToken();
    }

    ValidateToken();
}

private void InjectToken()
{
    var token = ObjectFactory.GetInstance<AntiForgeryToken>();
    ReferenceToken = token.ReferenceToken;
}

private void ValidateToken()
{
    var token = ObjectFactory.GetInstance<AntiForgeryToken>();
    if (ReferenceToken.Equals(token.ReferenceToken, SC.InvariantCultureIgnoreCase)) 
            return;
    ...do stuff for failed token
}

セッション内にトークンを格納する StructureMap ハンドルを持っているので、ユーザー セッションごとに永続化されます。これはすべて、偽造防止スキームの有効な実装でしょうか?

編集:私の質問にはいくつかの混乱があるようです。はい、 ASP.NET MVC には AntiForgeryToken スキームが組み込まれていることを理解しています。この質問は、CSRF 攻撃 (クロス サイト リクエスト フォージェリ)。これにより、ユーザー権限の適切な承認が不要になるわけではないことを理解しています。

@Neal と @solairaja が投稿したまさにそのリンクを表示するつもりでした: ASP.NET MVC の AntiForgeryToken() helper を使用して Cross-Site Request Forgery (CSRF) を防止します。この記事では、CSRF 攻撃とは何か、MVC がそれをどのように阻止するかについて詳しく説明しますが、その解決策は Web フォームには適用できないため、独自の実装に取り​​掛かりました。

@Neal からの応答を見た後、GUID の作成を置き換える可能性が最も高い MVC ツールから実際のソース コードを取得できることに気づかなかったので、それが受け入れられる可能性が最も高いと思います。しかし、他の誰かが追加する価値のある情報を持っている場合に備えて、質問を開いたままにします.

4

8 に答える 8

4

クリス、

あなたのアプローチは、RNGCryptoServiceProvider から生成された base64 でエンコードされたバイト配列を使用し、ページ (非表示のフォーム フィールド) と Cookie の両方にトークンを格納することを除いて、MVC の偽造防止アプローチを多かれ少なかれ模倣しています。より多くのロジックをトークンの実装に移動することをお勧めします (たとえば、ほとんどの検証ロジックを token 内にカプセル化します)。

MVC 実装のコードは、http://aspnet.codeplex.com/sourcecontrol/changeset/view/23011?projectName=aspnet#391757 で自由にアクセスできます。可能であれば、 http ://blog.codevilleと同様に確認する必要があります。 .net/2008/09/01/prevent-cross-site-request-forgery-csrf-using-aspnet-mvcs-antiforgerytoken-helper/分析とアイデアについて。

于 2009-11-17T00:45:24.110 に答える
2

ASP.NET Web フォームは、View State を使用している場合、デフォルトで CSRF 攻撃を防ぎます。アプリケーションでビュー ステートを効果的に無効にしている場合を除き、問題を解決するためにコードを追加していることになります。

View State は CSRF 攻撃を防ぎます
.Net CSRF Guard - OWASP

于 2010-12-16T14:42:33.507 に答える
0

NICK が言ったように、私にとっても、あなたが与えたコードは、ページに GUID を挿入し、ページが戻ってきたときに同じ GUID を探しているように見えます。セッションに保存する構造マップを使用する場合も、これは良い考えです。

ただし、この偽造防止の概念に利用できる組み込みの方法がいくつかあります。

まずは以下のリンクを参照し、理解してください。

http://blog.maartenballiauw.be/post/2008/09/01/ASPNET-MVC-preview-5s-AntiForgeryToken-helper-method-and-attribute.aspx

今、

詳細な説明とアプローチの方法については、以下のリンクを確認してください。

http://msdn.microsoft.com/en-us/library/system.web.mvc.htmlhelper_methods.aspx

http://blog.codeville.net/2008/09/01/prevent-cross-site-request-forgery-csrf-using-%20aspnet-mvcs-antiforgerytoken-helper/

ありがとうございました !!

于 2009-11-17T05:49:24.867 に答える
0

リクエストごとにカナリアを生成しているように見えます。ユーザーが複数のタブを開くとどうなるでしょうか。:)

あなたのアプローチ (および ASP.NET MVC 実装) の問題は、開発者がそれを実装することに依存していることです。このようなセキュリティは、オプトインではなく、オプトアウトであるべきです。AntiCSRF モジュールを作成したとき、代わりに ASP.NET ページ ライフサイクルを使用することになりました。これは、開発者が CSRF チェックからページをオプトアウトしたい場合を除き、基になるコードを変更しないことを意味します。そのユーザーのブラウザー セッションの存続期間中続く単一のトークンを使用することに注意してください。要求ごとにトークンを実際に変更する必要はありません。

今、私は主に次の本のいくつかの概念を説明する方法としてモジュールを書きました (ここに広告を挿入grin )。もちろんViewStateUserKeyを使用できますが、これもオプトアウトではなくオプトインです。

于 2009-11-17T14:46:31.993 に答える
0

まず、お聞きしたいのですが、「偽造防止」とはどういう意味ですか? 偽造されて気になることは?以下の残りの部分は、頭に浮かぶ一般的な情報です...

私が変更したいことの 1 つは、Guid.NewGuid を使用しないことです。それがランダムであるかどうかについては議論があり、したがってセキュリティ目的には適していません。そうは言っても、それをやってのけるのは非常に難しい攻撃だと思います。

GetBytes メソッドの RNGCryptoServiceProvider を見て、ランダム トークンを生成するのに適したものを見つけてください。より良いランダム性に加えて、これのもう 1 つの利点は、任意のサイズにすることができることです。

ただし、ssl経由でこれを行っていますか?まず、ssl は中間者攻撃に対する防御の第 1 のラインです。すべてのニーズに対して十分に安全ではないかもしれません (そして、他の人がそれについて議論することができます) が、そのようなことを心配している場合は、他に何もないにしても、それが出発点です. そうでない場合、最初に応答する中間者ではなく、適切なマシンから応答を得ていることをどのように確認しますか? SSL または同等のものを使用しないと、トークンは他の手段と同じように簡単に盗まれます。

追加を検討するもう 1 つの点は、トークンを 1 回の旅行にのみ有効にし、次の旅行でクライアントに返す新しいトークンを生成することです。再利用しようとすると失敗します。

それがあなたが考えていることであるなら、私はSSLをあなた自身の工夫の何かに置き換えようとはしません. ただし、リプレイが心配な場合は、1 回限りのトークン生成が停止する 1 つの方法です。ユーザーが同じフォーム データを 2 回送信することを懸念している場合は、これを行う必要があります。それについて心配している場合は、アプリケーション全体の設計も検討します。リプレイや同様のシナリオの多くは、クライアントがショッピング カート内のアイテムの価格などの機密情報を送信することを信頼しないなど、ビジネス ロジックを適切に設計することによって無効にすることができます。

出発点として、ASP.NET および IIS セキュリティに関するさまざまな Microsoft ガイダンス (つまり、Google ASP.NET または IIS セキュリティ サイト:microsoft.com) も確認してください。多くの賢明な人々が、私たちのためにすでに多くの問題を解決してきました。

于 2009-11-12T21:39:01.087 に答える
-1

そのような偽造防止トークンを使用する代わりに、認証されたユーザーが要求された変更を行うために必要な権利を実際に持っていることを検証します。

たとえば、Web ページが「ユーザー作成ページ」である場合、認証されたユーザーが新しいユーザーを作成する権限を持っていることを確認します。このページは「ユーザー X の編集ページ」ですか? 認証されたユーザーがユーザー X を変更する権限を持っていることを確認します。おそらく、彼自身がユーザー X または管理ユーザーであるためです。

とはいえ、GUID の使用はあまり安全ではありません。Guid は、ランダム性ではなく、一意性のために作成されたアルゴリズムに基づいて生成されます。私の知る限り、名前ベース、時間ベース、ランダムの 3 つの有効なアルゴリズムがあります。システムで使用される Guid アルゴリズム (将来の .NET バージョンで変更される可能性があります) が時間ベースである場合、有効な Guid を推測することはそれほど難しくありません。

于 2009-11-17T11:12:06.390 に答える
-1

セキュリティの第 1 のルール:自分でセキュリティをロールしようとしないでください

あなたの説明を理解しているように、それは有効な偽造防止スキームではありません. 攻撃者がこれを回避する必要があるのは、ブラウザのソース表示機能を使用してトークンを見つけることだけです。次に、そのトークンを投稿することを覚えている限り、好きなものを投稿できます。コードは違いを認識しません。

私があなたの説明を完全に誤解していたら、申し訳ありません...

于 2009-11-10T08:10:02.040 に答える