asp.netWebForm(.netFramework) CSRF漏洞
CSRF(Cross-Site Request Forgery)跨站請求偽造是一種常見的 Web 應用程序安全漏
洞,攻擊者通過誘使已認證用戶在受信任的網站上執行惡意操作,從而利用用戶的身份
執行未經授權的操作。攻擊者通常會在第三方網站上植入惡意代碼或鏈接,當用戶訪問
這些網站時,惡意請求會被發送到目標網站,利用用戶的身份執行操作,如更改密碼、
轉賬等。CSRF 漏洞可能導致以下安全問題:未經授權的操作:攻擊者可以利用 CSRF 漏
洞執行未經授權的操作,如更改用戶密碼、刪除賬戶等。數據篡改:攻擊者可以通過
CSRF 漏洞修改用戶數據,如更改個人信息、發表惡意內容等。跨站腳本執行:攻擊者
可以通過 CSRF 漏洞執行跨站腳本(XSS)攻擊,從而獲取用戶的敏感信息。
解決方案:
1、使用 CSRF 令牌:在每個請求中包含 CSRF 令牌,確保請求是合法的,防止攻擊者偽
造請求。
需要安裝Microsoft.AspNet.WebPages
// 頁面<input type="hidden" id="hiddenFieldToken" runat="server" />//頁面加載事件protected void Page_Load(object sender, EventArgs e){// 生成 CSRF Tokenstring cookieToken, formToken;System.Web.Helpers.AntiForgery.GetTokens(null, out cookieToken, out formToken);hiddenFieldToken.Value = cookieToken + ":" + formToken;}//按鈕提交protected void Btn_Click(object o, EventArgs e){// 拆分存儲的 Tokenstring[] tokens = hiddenFieldToken.Value.Split(':');if (tokens.Length == 2){try{// 驗證 CSRF TokenSystem.Web.Helpers.AntiForgery.Validate(tokens[0], tokens[1]);}catch (HttpAntiForgeryException){// Token 驗證失敗Response.Write("驗證失敗,可能是 CSRF 攻擊!");return;}}}
2、同源策略:確保網站遵循同源策略,限制第三方網站對用戶數據的訪問。
方法1:在每個頁面的 Page_Load 方法中添加如下代碼:
protected void Page_Load(object sender, EventArgs e)
{// 設置 Content-Security-PolicyResponse.Headers.Add("Content-Security-Policy", "default-src 'self';");// 設置 X-Frame-OptionsResponse.Headers.Add("X-Frame-Options", "SAMEORIGIN");
}
方法 2: 使用 HTTP 模塊
創建一個自定義 HTTP 模塊是一種集中管理 HTTP 響應頭的有效方法。這樣可以在不修改每個頁面的情況下,集中控制整個應用程序的 HTTP 頭部設置。
using System;
using System.Web;public class SecurityHeadersModule : IHttpModule
{public void Init(HttpApplication context){context.BeginRequest += new EventHandler(OnBeginRequest);}private void OnBeginRequest(object sender, EventArgs e){HttpContext context = ((HttpApplication)sender).Context;// 設置 Content-Security-Policycontext.Response.Headers.Add("Content-Security-Policy", "default-src 'self';");// 設置 X-Frame-Optionscontext.Response.Headers.Add("X-Frame-Options", "SAMEORIGIN");}public void Dispose(){// 清理代碼或釋放資源}
}
配置文件注冊HttpModule
<configuration><system.webServer><modules><add name="SecurityHeadersModule" type="YourNamespace.SecurityHeadersModule" /></modules></system.webServer>
</configuration>
3、驗證 HTTP Referer 頭部:驗證請求的來源,確保請求來自合法的網站。
protected void Page_Load(object sender, EventArgs e)
{if (IsPostBack){Uri referrerUri = Request.UrlReferrer;if (referrerUri == null || !(referrerUri.Host.EndsWith("example.com") && referrerUri.Port == 8080)){Response.Write("非法請求來源!");Response.End();}}
}