依存関係噴射を通じて抗フォージュトークンを作成します
-
19-09-2019 - |
質問
私は会社のウェブサイトのセキュリティの改善に取り組んでおり、簡単に維持できる偽造の試みを防ぐためにトークンを作成したいと考えていました。
public class AntiForgeryToken
{
private readonly string _referenceToken;
public AntiForgeryToken()
{
_referenceToken = Guid.NewGuid().ToString();
}
public string ReferenceToken
{
get { return _referenceToken; }
}
}
私の傑作の私の基本クラスでは、私は名前の名前のあるプロパティで包まれた隠れたフィールドを持っています: 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が組み込みの吸血症のスキームを持っていることを理解しています、この質問はこれを再現する方法について明確にあります ウェブフォーム CSRF攻撃の使用を防ぐため(Cross Site Request Forgery)。これは、ユーザーの権利の適切な承認の必要性を削除することを意味しません。
@nealと@solairajaが投稿したまさにそのリンクを持ち出すつもりでした: ASP.NET MVCのAntiForgeryToken()ヘルパーを使用して、クロスサイトリクエスト偽造(CSRF)を防ぐ. 。この記事では、CSRF攻撃が何であるか、MVCがどのように停止するかについて詳しく説明していますが、そのソリューションはWebFormsに適用できないため、私は自分のものを実装しました。
@nealからの応答を確認した後、GUID作成を置き換える可能性が最も高いMVCツールから実際のソースコードを取得できることに気付いていなかったため、それはおそらく受け入れられた答えになると思います。しかし、他の誰かが追加する貴重な情報を持っている場合、私は質問を開いたままにします。
解決
クリス、
あなたのアプローチは、MVCの浸透防止アプローチを多かれ少なかれ模倣します。ただし、RNGCRYPTOSERVICEPROVIDERから生成されたBase64エンコードされたバイトアレイを使用し、ページ(隠しフォームフィールド)とCookieの両方にトークンを保存します。より多くのロジックをトークンの実装に移動することをお勧めします(たとえば、トークン内の検証ロジックのほとんどをカプセル化します)。
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/ 分析 +アイデアの場合。
他のヒント
ASP.NET Webフォームは、ビュー状態を使用している場合、デフォルトでCSRF攻撃をボックスから防止します。アプリケーションでビュー状態を効果的に無効にしていない限り、コードを追加して問題を解決していない場合があります。
VIEW状態はCSRF攻撃を防ぎます
.NET CSRFガード-OWASP
まず、私は尋ねるべきだと思います...あなたは本当に「抗装飾」とはどういう意味ですか?鍛造されるのは何ですか?次のことの残りの部分は、頭に浮かぶ一般的な情報です...
私が変更することの1つは、Guid.newGuidを使用しないことです。それがランダムであるかどうか、したがってセキュリティ目的に適していないかどうかについて議論があります。そうは言っても、私はそれを引き離すのは非常に難しい攻撃だと思います。
ランダムなトークンを生成するために優れている必要があるものについては、getBytesメソッドについては、rngcryptoserviceproviderをご覧ください。ランダム性の向上に加えて、これに対するもう1つの利点は、必要なサイズにすることができることです。
SSLを介してこれを行っていますか?まず、SSLは、中間攻撃の男性の防衛ナンバーワンです。あらゆるニーズのために十分に安全ではないかもしれません(そして他の人はそれについて議論することができます)が、あなたがそのようなことを心配しているなら、それは他に何もないとしても出発点です。そうでない場合、最初に応答している中間の男ではなく、適切なマシンから応答を得ることをどのように保証しますか? SSLまたは同等のものがなければ、トークンは他のことと同じくらい簡単に盗まれます。
追加を検討すべきことの1つは、トークンを1回の旅行にしか適しておらず、次の旅行で新しい1つの旅行をクライアントに生成することです。再利用しようとすると失敗します。
私は...するだろう いいえ それがあなたが考えているものであるなら、SSLをあなた自身の工夫の他の何かに置き換えてみてください。しかし、リプレイを心配している場合は、トークン生成が一度停止する1つの方法です。ユーザーが同じフォームデータを2回送信することを心配している場合は、これが1つのことです。あなたがそれについて心配しているなら、私はあなたの全体的なアプリケーションの設計を検討します。多くのリプレイや同様のシナリオは、ショッピングカートのアイテムの価格などの機密情報をクライアントに信頼していないなど、ビジネスロジックのサウンドデザインによって打ち負かされます。
また、ASP.NETおよびIISセキュリティに関するさまざまなMicrosoftガイダンス(IE Google ASP.NETまたはIISセキュリティサイト:Microsoft.com)を出発点としてチェックしてください。多くの賢い人々は、私たちにとってすでに多くの問題を解決してきました。
これはすべて、抗泳動スキームの有効な実装でしょうか?
私が知る限り、あなたはページにガイドを挿入し、ページが戻ってきたときに同じガイドを探しているように見えます。
あなたの要件が何であるかわからないので、スキームが本当に「有効」であるかどうかはわかりません。しかし、私はいくつかのことを指摘することができます:
- GUIDがページにのみ存在している場合、ユーザーが1つのマシンでページを読んで別のマシンからフォームを送信することを防ぐのはなぜですか?まだそうでない場合は、Cookieまたはセッション(Cookieも使用します)に関連付けるのは良いことです。
- GUIDが静的な非表示としてページに書き込まれる場合
<input>
フィールド、その後、フォームを読み取り、ボットで提出できます。ページ上のスクリプトを要求してトークンを処理することで、それを送信することで、それを回避できます。 - ViewStateを使用していますか?もしそうなら、あなたはただ設定することを検討するかもしれません
ViewStateUserKey
クライアントごとに一意の繰り返しの価値に。ここで説明したものと同様の機能を実行します。
ニックが言ったように、私にとってもあなたが与えたコードは、あなたがページにガイドを挿入し、ページが戻ってきたときに同じガイドを探しているように見えます。セッションに保存する構造マップを使用する場合も、それは良い考えです。
しかし、この抗装置の概念にはいくつかの組み込みの方法があります。
以下のリンクを最初に参照して理解してください
今、
詳細の説明とアプローチの方法論については、以下のリンクを確認してください。
http://msdn.microsoft.com/en-us/library/system.web.mvc.htmlhelper_methods.aspx
ありがとうございました !!
それはあたかもそれがすべての要求でカナリアを生成しているかのように私に見えます。これで、ユーザーが複数のタブを開くとどうなりますか? :)
あなたのアプローチ(およびASP.NET MVC実装)の問題は、それを実装するために開発者に依存していることです。このようなセキュリティは、オプトインではなく、オプトアウトする必要があります。私が書いたとき AnticsRFモジュール 代わりにASP.NETページのライフサイクルを使用することになりました。つまり、開発者がCSRFチェックからページを選択したい場合を除き、基礎となるコードの変更はありません。そのユーザーのブラウザセッションの寿命に伴う単一のトークンを使用することに注意してください。リクエストごとにトークンを変更する必要はありません。
今、私は主に私の来る本のためのいくつかの概念を説明する方法としてモジュールを書きました(ここに広告を挿入します にやにや笑います)、もちろん使用できます viewstateuserkey, 、しかし、これもオプトアウトではなくオプトインです。
セキュリティの最初のルール: 独自のセキュリティを展開しようとしないでください
私があなたの説明を理解しているように、それは有効な浸透防止スキームではありません。攻撃者はすべてを回避する必要があります。 ソースを表示します トークンを見つけるための彼または彼女のブラウザの機能。それから彼または彼女は、彼らがそのトークンを投稿することを覚えている限り、好きなものを投稿することができ、あなたのコードは違いを知らないでしょう。
私があなたの説明を完全に誤解した場合、お詫びします...
そのような偽造防止トークンを使用する代わりに、認証されたユーザーが実際に要求された変更を行うために必要な権利を持っていることを検証します。
たとえば、Webページは「ユーザーページの作成」です。認証されたユーザーが新しいユーザーを作成する許可があることを確認します。ページは「ユーザーXページの編集」です。認証されたユーザーがユーザーXを変更する許可があることを確認します。たぶん、彼自身がユーザーX、または管理ユーザーであるためです。
とはいえ、GUIDを使用することはあまり安全ではありません。 GUIDは、ランダム性ではなく、一意性のために記述されたアルゴリズムに基づいて生成されます。 AFAIK名前ベース、時間ベース、ランダムの3つの有効なアルゴリズムがあります。システムで使用されるGUIDアルゴリズム(将来の.NETバージョンによって変更される可能性がある)が時間ベースである場合、有効なGUIDを推測することはそれほど難しくありません。