让你的ASP.NET Core应用程序更安全
對于ASP.NET Core應用程序,除了提供認證和授權機制來保證服務的安全性,還需要考慮下面的一些安全因素:
CSRF
強制HTTPS
安全的HTTP Headers
CSRF
ASP.NET Core通過AntiForgeryToken來阻止CSRF攻擊,一般來說,當用戶做表單提交的時候,表單中隱藏的token也會被提交到服務端,與此同時cookie中包含的另一半token也被提交到服務端,服務端通過合并兩份token來驗證客戶端的數據是否有效。
例如在ASP.NET Core中通過下面的方式渲染表單:
<form asp-controller="Manage"asp-action="ChangePassword"?method="post"> ???<!-- Form details --> </form> |
這樣會生成下面的html,表單會包含一個隱藏的token
<form method="post"?action="/Manage/ChangePassword"> ??<!-- Form details --> ??<input name="__RequestVerificationToken"?type="hidden"?value="CfDJ8NrAkSldwD9CpLR...LongValueHere!"?/> </form> |
服務端的代碼通過在對應的action上標記ValidateAntiForgeryToken來驗證客戶端的請求
public?class?ManageController { ??[HttpPost] ??[ValidateAntiForgeryToken] ??public?IActionResult ChangePassword() ??{ ????return?View(); ??} } |
是不是每個POST請求都需要添加這樣的attribute呢?
ASP.NET Core中有Filter的概念,通過添加全局Filter就能幫我們達到這樣的目的:
public?class?Startup { ??public?void?ConfigureServices(IServiceCollection services) ??{ ????services.AddMvc(options => ????{ ????????options.Filters.Add(new?AutoValidateAntiforgeryTokenAttribute()); ????}); ??} } |
AutoValidateAntiforgeryTokenAttribute會自動忽略不需要做CSRF驗證的請求類型,例如HttpGet請求。
強制HTTPS
為了讓服務更加安全,你還可以強制用戶使用https,你可以通過配置API網關的方式達到這個目的,也可以使用ASP.NET Core自帶的特性。
使用了RequireHttpsAttribute之后,http請求將會報錯。
services.Configure<MvcOptions>(options => ???{ ???????options.Filters.Add(new?RequireHttpsAttribute()); ???}); |
通過下面的方式強行跳轉到https。
public?void?Configure(IApplicationBuilder app, IHostingEnvironment env) { ????app.UseHttpsRedirection(); } |
通過https://securityheaders.com/來檢查HTTP Header是不是安全,例如下面的掃描結果:
NWebsec是一個用來做安全相關的ASP.NET Core類庫,針對ASP.NET Core中HTTP Header相關的修復,可以添加下面的Nuget包:
NWebsec.AspNetCore.Middleware |
Strict-Transport-Security:為了告訴瀏覽器所有的資源都必須使用https,你需要添加這個header:
app.UseHsts(hsts => hsts.MaxAge(365)); |
Redirect validation: 一旦啟用了這個中間件,只能被Redirect到允許的站點, 否則會觸發RedirectValidationException
app.UseRedirectValidation(opts => ????????{ ????????????opts.AllowSameHostRedirectsToHttps(); ????????????opts.AllowedDestinations("https://www.google.com/accounts/"); ????????}); |
Referrer-Policy: 當用戶點擊了瀏覽器上的連接,請求報頭中Referrer用來表示連接的來源,這個特性也可以用來做一些數據分析,通過Referrer-Policy可以控制是否顯示Referrer:
app.UseReferrerPolicy(opts => opts.NoReferrer()); |
Content-Security-Policy:內容安全策略,這個http header可以讓瀏覽器自動禁止外部注入惡意腳本,例如下面的策略將限制所有的腳本只能從同域加載:
1 | 'Content-Security-Policy': 'script-src \'self\'' |
下面的腳本引用將會引起瀏覽器報錯:
<script type="text/javascript" src="https://cdn.bootcss.com/jquery/3.3.1/jquery.js"></script> |
使用NWebsec配置Content-Security-Policy:
app.UseCsp(options => options ????????.DefaultSources(s => s.Self()) ????????.ScriptSources(s => s.Self().CustomSources("scripts.nwebsec.com")) ????????.ReportUris(r => r.Uris("/report"))); |
X-XSS-Protection: 防XSS攻擊設置
app.UseXXssProtection(options => options.EnabledWithBlockMode()); |
X-Content-Type-Options: 如果服務器發送響應頭 X-Content-Type-Options: nosniff,則 script 和 styleSheet 元素會拒絕包含錯誤的 MIME 類型的響應。這是一種安全功能,有助于防止基于 MIME 類型混淆的攻擊。
app.UseXContentTypeOptions(); |
其他的安全設置參考NWebsec文檔。
原文地址:https://www.cnblogs.com/xiandnc/p/10738939.html
.NET社區新聞,深度好文,歡迎訪問公眾號文章匯總?http://www.csharpkit.com?
總結
以上是生活随笔為你收集整理的让你的ASP.NET Core应用程序更安全的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: Asp.Net Core Web应用程序
- 下一篇: 包治百病 | 如何将一个.NET Cor