http://madskristensen.net/post/Brute-force-protect-your-website.aspxのように、失敗したログイン数の制限を介してブルートフォース保護を実装しました。 しかし、2つの問題が発生しています。
- 一定の時間が経過しても(私の場合は2分)、キャッシュ内のレコードの有効期限が切れておらず、再度ログインできません。これは、関数が失敗した試行の数をチェックするときに、この5分後も最大許容値を取得することを意味します
私が理解したMSDNからのキャッシュは、アプリケーション用の単一のストレージです。私のアプリケーションで見ると、キャッシュはアプリケーションごと、IPごとのようです。なんで?助言がありますか?これが私のコードです:
int CountOfFailedLoginAttempts() { if(Cache["L1|"+TextBox1.Text]==null) { return 0; } return (int) Cache["L1|" + TextBox1.Text]; } void AddFailedAttempt() { if(Cache["L1|"+TextBox1.Text]==null) { Cache.Insert("L1|"+TextBox1.Text,1,null,System.Web.Caching.Cache.NoAbsoluteExpiration,new TimeSpan(0,2,0)); } else { int tries = (int) Cache["L1|" + TextBox1.Text]; Cache["L1|" + TextBox1.Text] = tries + 1; } } void ClearFailedAttemptCounter() { Cache.Remove("L1|" + TextBox1.Text); } protected void Button1_Click(object sender, EventArgs e) { if (CountOfFailedLoginAttempts() >= 5) { Label1.Text = "Login will be unavailable for 2 minutes"; } else { SqlConnection con = new SqlConnection("valid connection string"); SqlCommand cmd = new SqlCommand("Select top 1 password from users WHERE UserName=@UN", con); cmd.CommandTimeout = 600; cmd.Parameters.Add(new SqlParameter("UN", TextBox1.Text)); con.Open(); string res = (string) cmd.ExecuteScalar(); con.Close(); if (res == TextBox2.Text) { FormsAuthentication.RedirectFromLoginPage(TextBox1.Text, true); ClearFailedAttemptCounter(); } else { Label1.Text = "Wrong password. "+(5-CountOfFailedLoginAttempts()).ToString()+"more attempts and access will be suspended for 2 minutes."; AddFailedAttempt(); } } }
}