让你的ASP.NET Core应用程序更安全

对于ASP.NET Core应用程序,除了提供认证和授权机制来保证服务的安全性,还需要考虑下面的一些安全因素:

  1. CSRF
  2. 强制HTTPS
  3. 安全的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();
}

让HTTP Header更加安全

通过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可以让浏览器自动禁止外部注入恶意脚本,例如下面的策略将限制所有的脚本只能从同域加载:
'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文档

让你的ASP.NET Core应用程序更安全的更多相关文章

  1. (转) 将ASP.NET Core应用程序部署至生产环境中(CentOS7)

    原文链接: http://www.cnblogs.com/ants/p/5732337.html 阅读目录 环境说明 准备你的ASP.NET Core应用程序 安装CentOS7 安装.NET Cor ...

  2. ASP.NET Core 中文文档 第二章 指南(1)用 Visual Studio Code 在 macOS 上创建首个 ASP.NET Core 应用程序

    原文:Your First ASP.NET Core Application on a Mac Using Visual Studio Code 作者:Daniel Roth.Steve Smith ...

  3. ASP.NET Core 中文文档 第二章 指南(8) 使用 dotnet watch 开发 ASP.NET Core 应用程序

    原文:Developing ASP.NET Core applications using dotnet watch 作者:Victor Hurdugaci 翻译:谢炀(Kiler) 校对:刘怡(Al ...

  4. 在Mac下运行ASP.NET Core应用程序

    在Mac下运行ASP.NET Core应用程序 通过参照.NET Core相关官方文档,在我的Mac电脑上用Visual Studio Code创建了我的第一个ASP.NET应用. 开发环境搭建 首先 ...

  5. 将ASP.NET Core应用程序部署至生产环境中(CentOS7)

    这段时间在使用Rabbit RPC重构公司的一套系统(微信相关),而最近相关检验(逻辑测试.压力测试)已经完成,接近部署至线上生产环境从而捣鼓了ASP.NET Core应用程序在CentOS上的部署方 ...

  6. Jexus针对Asp.net core应用程序的六大不可替代的优势

    1,配置简便:在Jexus上,Asp.net core只是Jexus上的一个"站点",因此,只需在Jexus上配置这个站点就行,无需其它配置: 2,操作统一:Jexus停止这个站点 ...

  7. 使用VS Code开发ASP.NET Core 应用程序

    最新教程:http://www.cnblogs.com/linezero/p/VSCodeASPNETCore.html 使用VS Code开发ASP.NET Core 应用程序 准备 1.安装VS ...

  8. 将ASP.NET Core应用程序部署至生产环境中(CentOS7)(转)

    阅读目录 环境说明 准备你的ASP.NET Core应用程序 安装CentOS7 安装.NET Core SDK for CentOS7. 部署ASP.NET Core应用程序 配置Nginx 配置守 ...

  9. Mac下运行ASP.NET Core应用程序

    Mac下运行ASP.NET Core应用程序 在Mac下运行ASP.NET Core应用程序 通过参照.NET Core相关官方文档,在我的Mac电脑上用Visual Studio Code创建了我的 ...

随机推荐

  1. go语言 nsq源码解读三 nsqlookupd源码nsqlookupd.go

    从本节开始,将逐步阅读nsq各模块的代码. 读一份代码,我的思路一般是: 1.了解用法,知道了怎么使用,对理解代码有宏观上有很大帮助. 2.了解各大模块的功能特点,同时再想想,如果让自己来实现这些模块 ...

  2. POI读取excel文件。

    1) poi读取现成.xls文件,不需要自己建立.xls ====ReadExcel​类​==== package cust.com.excelToDataTest; import java.io.F ...

  3. 处理php出现default timezone抖动的问题

    懒癌发作1年多,再次回来写随笔.(上次是16年,再上次是13年,好像懒的没救了) 这回遇到一个系统前端展现的时间在无规律抖动的问题: 前端php环境是5.3,运行于apache上,php.ini中已经 ...

  4. Supervisor守护DotNet Core控制台程序

    Supervisor 相信对Linux系统很熟的都知道这个软件,基于Python写的一个守护进程软件.具体的介绍和使用我就不再赘述了. 使用asp.net core 部署在Linux常用的方法 我们可 ...

  5. python基于selenium实现自动删除qq空间留言板

    py大法好,让你解放双手. 脚本环境 python环境,selenium库,Chrome webdriver驱动等. 源码 # coding=utf-8 import datetime import ...

  6. 解决:git push error: failed to push some refs to

    出现错误的原因是github中的README.md文件不在本地代码目录中. 也就是说我们需要先将远程代码库中的任何文件先pull到本地代码库中,才能push新的代码到github代码库中. 使用如下命 ...

  7. HttpServletRequest 接口、HttpServletResponse 接口、请求转发与重定向

    上篇文章我们讲了servlet的基本原理,这章将讲一下剩余的部分. HttpServletRequest 接口 该接口是 ServletRequest 接口的子接口,封装了 HTTP 请求的相关信息, ...

  8. CBC 字节反转攻击

    一.CBC 简介 现代密码体制 现代密码中的加密体制一般分为对称加密体制(Symmetric Key Encryption)和非对称加密体制(Asymmetric Key Encryption).对称 ...

  9. Aria2序之导言

    aria2是什么,如果此时此刻你看到标题读到第一行正在思索着一个问题,很抱歉 ,这篇以及后续我的blog不适合你,请移步. 我在aria2的官方站点抄袭了如下语句用来充实本文: aria2 is a  ...

  10. vue 设计一个倒计时秒杀的组件

    简介: 倒计时秒杀组件在电商网站中层出不穷  不过思路万变不离其踪,我自己根据其他资料设计了一个vue版的 核心思路:1.时间不能是本地客户端的时间  必须是服务器的时间这里用一个settimeout ...