asp.net core下給網(wǎng)站做安全設(shè)置的方法詳解
前言
本文主要介紹了關(guān)于asp.net core給網(wǎng)站做安全設(shè)置的相關(guān)內(nèi)容,分享出來(lái)供大家參考學(xué)習(xí),下面話不多說(shuō)了,來(lái)一起看看詳細(xì)的介紹吧
設(shè)置方法如下
首先,我們來(lái)看下stack overflow網(wǎng)站的請(qǐng)求頭文件:

可以看到一些我們熟悉或是陌生的HTTP頭部文件字段。
在這里我們?cè)趯?duì)HTTP輸入流的頭部文件中,做一些基本的防護(hù)。首先要明確,既然我們是對(duì)HTTP頭部做處理,那么就需要在Startup.cs類的
Configuration方法中做處理,因?yàn)檫@里就是處理HTTP輸入流的。
首先做一些基本的處理,比如中間件和基本的類:
public class SecurityHeadersPolicy
{
public IDictionary<string, string> SetHeaders { get; }
= new Dictionary<string, string>();
public ISet<string> RemoveHeaders { get; }
= new HashSet<string>();
}
這里的頭部信息是我們定義好的,用來(lái)增加或是刪除頭部信息,然后就是我們的中間件:
public class SecurityHeadersMiddleware
{
private readonly RequestDelegate _next;
private readonly SecurityHeadersPolicy _policy;
public SecurityHeadersMiddleware(RequestDelegate next, SecurityHeadersPolicy policy)
{
_next = next;
_policy = policy;
}
public async Task Invoke(HttpContext context)
{
IHeaderDictionary headers = context.Response.Headers;
foreach (var headerValuePair in _policy.SetHeaders)
{
headers[headerValuePair.Key] = headerValuePair.Value;
}
foreach (var header in _policy.RemoveHeaders)
{
headers.Remove(header);
}
await _next(context);
}
}
基于IApplicationBuilder接口做一個(gè)中間件的擴(kuò)展方法:
public static class MiddlewareExtensions
{
public static IApplicationBuilder UseSecurityHeadersMiddleware(this IApplicationBuilder app, SecurityHeadersBuilder builder)
{
SecurityHeaderPolicy policy = builder.Build();
return app.UseMiddleware<SecurityHeadersMiddleware>(policy);
}
}
封裝好相關(guān)的安全類:
public class SecurityHeadersBuilder
{
private readonly SecurityHeadersPolicy _policy = new SecurityHeadersPolicy();
public SecurityHeadersBuilder AddDefaultSecurePolicy()
{
AddFrameOptionsDeny();
AddXssProtectionBlock();
AddContentTypeOptionsNoSniff();
AddStrictTransportSecurityMaxAge();
RemoveServerHeader();
return this;
}
public SecurityHeadersBuilder AddFrameOptionsDeny()
{
_policy.SetHeaders[FrameOptionsConstants.Header] = FrameOptionsConstants.Deny;
return this;
}
public SecurityHeadersBuilder AddFrameOptionsSameOrigin()
{
_policy.SetHeaders[FrameOptionsConstants.Header] = FrameOptionsConstants.SameOrigin;
return this;
}
public SecurityHeadersBuilder AddFrameOptionsSameOrigin(string uri)
{
_policy.SetHeaders[FrameOptionsConstants.Header] = string.Format(FrameOptionsConstants.AllowFromUri, uri);
return this;
}
public SecurityHeadersBuilder RemoveServerHeader()
{
_policy.RemoveHeaders.Add(ServerConstants.Header);
return this;
}
public SecurityHeadersBuilder AddCustomHeader(string header, string value)
{
_policy.SetHeaders[header] = value;
return this;
}
public SecurityHeadersBuilder RemoveHeader(string header)
{
_policy.RemoveHeaders.Add(header);
return this;
}
public SecurityHeadersPolicy Build()
{
return _policy;
}
}
最后注入到HTTP的輸入流中:
app.UseSecurityHeadersMiddleware(new SecurityHeadersBuilder() .AddDefaultSecurePolicy() );
然后我們?yōu)g覽一下網(wǎng)頁(yè),就可以在HTTP的頭部信息中看到:
HTTP/1.1 200 OK Content-Type: text/html; charset=utf-8 X-Frame-Options: DENY X-XSS-Protection: 1; mode=block X-Content-Type-Options: nosniff Strict-Transport-Security: max-age=31536000 X-Powered-By: ASP.NET
還有一個(gè)就是CSRF的防護(hù),如果之前你用過(guò)ASP.NET MVC,在最基本的MVC模板中,可能你會(huì)留意到已有的cshtml頁(yè)面中的form表單有這么一句:
@Html.AntiForgeryToken()
這就是微軟在MVC框架中為我們提供的防護(hù)CSRF的方法。我們?cè)诒韱沃兄苯邮褂蒙厦婺蔷浯a就可以了,然后在表單提交的Action方法中:
[ValidateAntiForgeryToken]
[HttpPost]
public IActionResult AntiForm(string message)
{
return Content(message);
}
使用[ValidateAntiForgeryToken]屬性,來(lái)驗(yàn)證CSRF。
參考鏈接:
- How to add security headers in ASP.NET Core using custom middleware(如何使用自定義中間件在ASP.NET Core中添加安全標(biāo)頭)
- 初探CSRF在ASP.NET Core中的處理方式
代碼地址:
https://github.com/RyanOvO/aspnetcore-fileup-demo
總結(jié)
以上就是這篇文章的全部?jī)?nèi)容了,希望本文的內(nèi)容對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,如果有疑問(wèn)大家可以留言交流,謝謝大家對(duì)腳本之家的支持。
- .Net Core3 用Windows 桌面應(yīng)用開發(fā)Asp.Net Core網(wǎng)站
- 如何利用IIS調(diào)試ASP.NET網(wǎng)站程序詳解
- 利用IIS調(diào)試ASP.NET網(wǎng)站程序的完整步驟
- IIS部署asp.net mvc網(wǎng)站的方法
- ASP.NET Core 2.0 使用支付寶PC網(wǎng)站支付實(shí)現(xiàn)代碼
- CodeFirst從零開始搭建Asp.Net Core2.0網(wǎng)站
- 詳解ASP.NET Core 網(wǎng)站在Docker中運(yùn)行
- ASP.NET網(wǎng)站第一次訪問(wèn)慢的解決方法
- 如何使用ASP.NET創(chuàng)建網(wǎng)站并設(shè)計(jì)web頁(yè)面
相關(guān)文章
.NET?Core部署為Windows服務(wù)的詳細(xì)步驟
這篇文章主要介紹了.NET?Core部署為Windows服務(wù),想要將.NET?Core部署為window服務(wù),項(xiàng)目中需要進(jìn)行以下配置:項(xiàng)目中引入Microsoft.Extensions.Hosting.WindowsServices包,本文給大家詳細(xì)講解,需要的朋友可以參考下2022-10-10
ASP.NET基于Ajax的Enter鍵提交問(wèn)題分析
這篇文章主要介紹了ASP.NET基于Ajax的Enter鍵提交,結(jié)合實(shí)例形式分析了asp.net基于ajax響應(yīng)Enter鍵的提交方法與相關(guān)問(wèn)題解決技巧,具有一定參考借鑒價(jià)值,需要的朋友可以參考下2015-11-11
ASP.Net刷新頁(yè)面后自動(dòng)滾動(dòng)到原來(lái)位置方法匯總
本文給大家匯總了3種ASP.Net實(shí)現(xiàn)的刷新頁(yè)面后自動(dòng)滾動(dòng)到原來(lái)位置方法,十分的簡(jiǎn)單實(shí)用,有需要的小伙伴可以參考下。2015-06-06
Asp.net生成Excel文件并下載(更新:解決使用迅雷下載頁(yè)面而不是文件的問(wèn)題)
Asp.net生成Excel文件并下載(更新:解決使用迅雷下載頁(yè)面而不是文件的問(wèn)題)2012-01-01
解析WPF綁定層次結(jié)構(gòu)數(shù)據(jù)的應(yīng)用詳解
本文講述WPF中單層次數(shù)據(jù)和多層次數(shù)據(jù)的綁定方法,主要闡述數(shù)據(jù)綁定的顯示層面,其中涉及了ListBox和Treeview控件。并說(shuō)明它們之間的差異2013-05-05
詳解ASP.NET Core3.0 配置的Options模式
這篇文章主要介紹了詳解ASP.NET Core3.0 配置的Options模式,文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來(lái)一起學(xué)習(xí)學(xué)習(xí)吧2020-08-08
asp.net中將js的返回值賦給asp.net控件的小例子
要做一個(gè)顯示用戶在線停留時(shí)間的功能,拖了一個(gè)label控件用于顯示時(shí)間,而時(shí)間是通過(guò)js來(lái)實(shí)現(xiàn)的,現(xiàn)在要把js的返回值賦給label,方法如下:2013-03-03

