ASP.NET Core中的OWASP Top 10 十大风险-失效的访问控制与Session管理

本博文翻译自:
https://dotnetcoretutorials.com/2017/10/16/owasp-top-10-asp-net-core-broken-authentication-session-management/

在我们之前关于OWASP Top 10的文章中,我们讨论了SQL注入。SQL注入有一个非常明确的解释和例子,但这次我们讲的个关于“失效的访问控制和Session管理”有一个更开放的结尾。它涵盖了从糟糕的密码存储系统(纯文本,弱哈希)到通过Session暴露用户的所有内容(例如,URL中的Session字符串),我们演示的所有方法都是相对简单的,例如超时验证session。

和往常一样,虽然我们在这里讨论的话题是如何保护ASP.net Core应用程序让它有个好的开始,但这绝不是我们保护道路的尽头。特别是当涉及到密码的哈希时。这是一款总是与最新的威胁保持同步的游戏,我们需要时刻更新我们的的应用程序。

让我们开始吧!

密码哈希化

不言而喻,存储在数据库中的所有密码应该被哈希化并且具有单独的salt(稍后更多关于单独的salt的信息)。在任何情况下,密码都不能以纯文本形式存储。当您存储纯文本密码时,您不仅会冒着被黑客攻击的风险,而且网站上的用户帐户可能会被盗用,但由于人们倾向于在多个网站上使用相同的密码,所以在他们使用的每个网站上,你都有可能成为用户痛苦的来源。

使用 ASP.net Core Identity

如果您使用ASP.net Core Identity框架,你将会有安全的密码哈希和使用的单独的salt。Identity使用PBKDF2哈希函数来输入密码,并且它们会为每个用户生成一个随机salt。理想情况下,如果你不确定你在做什么,那就现在开始使用吧! 微软在启动和运行框架方面确实有很好的文档.。

让我们开始动手吧

虽然现在开始使用ASP.net Core Identity框架是绝对可取的,但有时你需要自己动手。但你自己动手的版本只能扩展C#代码用来验证,在任何情况下你都不应该“发明”自己的哈希算法来存储密码

OWASP建议使用4种不同的单向哈希函数来存储密码。他们分别是Argon2,PBKDF2,scrypt和bcrypt。如果你打算编写你自己的认证层,你必须使用其中的一个。

什么是Salt?

Salt是在哈希之前向您的密码添加随机字符串的行为。这样,即使相同的密码被哈希化,所得到的哈希值将会不同...是不是有些疑惑?我们用一个例子。本例中我将使用PBKDF2哈希函数。

比方说,我正在使用密码 apples4tea 。当我哈希化密码时我得到的结果: 09ADB1C51A54C33C11CD3AE113D820305EFA53A173C2FF4A3150B5EC934E76FF 。现在,如果第二个用户注册到我的网站并使用相同的密码,他们将得到完全相同的哈希值。您可以在这里使用PBKDF2在线计算器来自己测试。为什么这不好?因为这意味着任何黑客基本上都可以“预先计算”密码哈希值(例如,现在就拿一个最流行的密码列表),然后在数据库中简单地进行字符串比较。

在此基础上,这意味着共享相同密码的所有用户具有相同的哈希值。当一个用户的密码被“破解”或者甚至被猜出时,任何使用相同密码的人现在也都泄露了他们的密码。

现在我为用户添加一个随机Salt值,我将它连接到密码的开始处。第一次我的Salt值是 H786Bnh54A 。哈希化后H786Bnh54Aapples4tea的完整字符串 给了我 DfsjpycJwtWkOu8UcP8YXC / G09HES8LU + kku0iSllO4 =的哈希值 。另一个用户注册到该站点,并随机生成一个Salt值给他们 76HNhg67Ac 。现在我们使用相同的密码对salt进行哈希化,最后得到一个哈希值 RP62 + SmFCJLeQzROTtk5HpMId0zuFtsPeBFuBLpH / Sc =。现在我们有相同的密码,但有不同的哈希值。

众所周知,Adobe在2013年有一个巨大的数据泄露,泄露了用户的密码。密码并不是每个用户都加了Salt值,最糟糕的是,所有密码提示都存储在密码的旁边。也就是说,如果一个提示帮助您猜测一个用户密码,那么使用相同密码的任何用户在数据库中都会有相同的哈希值! Sophos在这里做了一个很好的报告.

如果你使用的是ASP.net Identity,那么salt会和密码一起存储在数据库中的同一列(因为salt每次都是相同的长度,所以我们只把这些字符当作salt来计算,其余部分就是哈希值)。在先前的ASP迭代中(在.NET完整框架中),salt存储在一个单独的列中。然而只要每个用户都有salt,而不是整个应用程序范围内拥有,就都可以。

暴露Session标识符

在以前的ASP.net版本中,你可以有一个“无cookie”的session。然后,您会看到与以下网址相似的网址:http://www.example.com/(S(lit3py55t21z5v55vlm25s55))/orderform.aspx 。会话数据实际上包含在URL中而不是cookie中。由于多种原因,这造成了严重的后果。想象一下把这个URL发给一个朋友,现在他们可以访问你的会话数据!更糟糕的是,如果您点击此页面上的任何出站链接,引用链接头将被设置为包含您的session。

在ASP.net Core中无cookie的sessions实际上从来没有实现,所以你不会看到这样的URL。但这并不意味着人们不会用自己的方式实现类似的东西。简而言之,通过任何方式给予另一个用户的URL都不能突然冒充用户。

通过未加密的连接发送数据

实际上有一个关于加密连接的完整的OWASP Top 10文章,但是这里值得特别提一下。即使你的密码全部被用户salt哈希化,而且你也不会在URL中暴露Session标识符,但是如果你容易受到“中间人”攻击的话,这意味着根本没有安全。一个用户连接到一些不可靠的开放wifi,可能意味着他们在登录时无意中泄露了我们的明文密码。

SSL意味着您从用户计算机到服务器进行加密,无论它需要什么路由 - 包括狡猾的wifi。鉴于免费的SSL提供商如Let's Encrypt的出现,甚至像Cloudflare这样的网站提供免费的SSL。没有理由不利用SSL来保护您的用户。

锁定,超时,等等

最后,我们在本文中已经讨论了ASP.net Core Identity。但我想再次指出的是,良好的习惯对这有多大的影响。我们来看看通常放置在您的Configure Services方法中的Identity的设置。

services.Configure(options =>
{    // Password settingsoptions.Password.RequireDigit = true;options.Password.RequiredLength = 8;options.Password.RequireNonAlphanumeric = false;options.Password.RequireUppercase = true;options.Password.RequireLowercase = false;options.Password.RequiredUniqueChars = 6;options.Lockout.DefaultLockoutTimeSpan = TimeSpan.FromMinutes(30);options.Lockout.MaxFailedAccessAttempts = 10;options.SignIn.RequireConfirmedEmail = true;options.User.RequireUniqueEmail = true;
});

看看你在这里的选项。有很好的密码执行选项(尽管你可以提出一些论点:但不要过分要求像字母数字这样的东西,因为人们倾向于把它们写在纸上...),如果他们锁定用户帐户不断输入错误的密码,甚至需要电子邮件确认(这也是身份框架的一部分)。

而在cookies如何存储在用户机器上,我们有这些选项:

services.ConfigureApplicationCookie(options =>
{options.Cookie.HttpOnly = true;options.Cookie.Expiration = TimeSpan.FromHours(1)options.SlidingExpiration = true;
});

又一次很棒的实践。用户cookie在默认情况下应该总是有一个过期值。一个来自OWASP的例子甚至明确指出了在攻击的例子中公共计算机session超时的问题:

在此基础上,我们应该尽可能使用HttpOnly cookie。当一个cookie被设置为HttpOnly时,这意味着它不能通过Javascript访问(因此,可能存在XSS漏洞),并且只能在作为请求的一部分发送时才能被访问。

我之所以使用这些例子,是因为它们是在进行身份验证和session管理时最佳实践指南。即使您决定自己动手,您也应该调查Identity给您的是什么,这样您就可以复制一些或所有的功能,并且始终保持对框架最新的的改进。

总结

身份验证和session管理是一个广泛的话题,我认为它被一些呆滞的遗留应用程序所困扰。通常,当我向新的开发人员展示诸如session标识符之类的东西时,他们无法想象为什么有人会这样做。“人们真的认为那是安全的吗?”这是我与之合作的一名初级开发人员的和我说过的话。我认为这是这个话题的本质,我们需要站在新安全的前沿,在认证和使用session的时候,我们要保持领先

相关文章:

  • ASP.NET Core中的OWASP Top 10 十大风险-SQL注入

原文地址:http://www.cnblogs.com/chen-jie/p/owasp-top-10-asp-net-core-broken-authentication-session-management.html


.NET社区新闻,深度好文,欢迎访问公众号文章汇总 http://www.csharpkit.com

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/322952.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

Docker部署运行微服务

1、环境准备: 主机: X-shell X-ftp jar包 这里只说下jar包,另外两个到官网下载即可 Idea打包jar包流程 先按这四步走 先点击左下的框框,再点击maven,出现右边的窗口,点击clean,再点击package&…

.net ef core 领域设计代码转换(上篇)

一、前言 .net core 2.0正式版已经发布几个月了,经过研究,决定把项目转移过来,新手的话可以先看一些官方介绍 传送门:https://docs.microsoft.com/zh-cn/dotnet/core/ 由于在领域设计模型上遇到了一些坑,故给大家分享出…

Debug ASP.NET Core 2.0源代码

首先你的VS必须为VS 2017 15.3或以上版本。 打开你的Startup类,在ConfigureServices方法上设置个断点,按F5 Debug应用。 在Call Stack(调用堆栈)窗口,我们只能看到自己的代码。打开VS tools(工具&#xff…

我心中的ASP.NET Core 新核心对象WebHost(一)

以本系列文章向Fish 前辈的那篇我心中的ASP.NET 核心对象致敬。(虽然不知道前辈现在在干什么)。一晃就6年过去了,那首 郝云 的《回到那一天》怎么唱来着? 时光一晃,你就三十了。 而我们都变成了老了的程序员 ASP.NET …

Scaffolding Template on Asp.Net Core Razor Page

Scaffolding Template Intro 我们知道在Asp.Net MVC中,如果你使用的EF的DBContext的话,你可以在vs中通过右键解决方案-添加控制器-添加包含视图的控制器,然后vs会根据你选择的Model自动生成相应的CURD的控制器和View,非常便利&…

Hadoop生态hive(一)介绍

一、Hive是什么 起源自facebook由Jeff Hammerbacher领导的团队,构建在Hadoop上的数据仓库框架。设计目的是让SQL技能良好,但Java技能较弱的分析师可以查询海量数据。2008年facebook把hive项目贡献给Apache。 由facebook开源,最初用于解决海量…

使用混合云的SQL Server

近期发布的Microsoft SQL Server 2017,表明Microsoft公司正寻求不断降低其所交付的工具对平台的绑定。在SQL Server 2017中,这一趋势可以从“混合云”(Hybrid Cloud)术语和多平台本质这两个方面得以证实。下面让我们分别一窥这两个…

.NET Core多平台项目模板eShopOnContainers编译手记

之前写了一个功能性的文件上传asp.net core的小程序,加上点七七八八的东西,勉强能够应付了,打算学习一下微软的官方.NET CORE微服务示例https://github.com/dotnet-architecture/eShopOnContainers。这个例子很全面地展现了微服务、docker以及…

如何改变Idea的背景

进入Idea 按下ctrlshifta 点击set background 选择自己准备好的图片地址,就可以更改背景了 更改后效果 关于接口的插件 GsonFormat插件 安装还是和别的插件一样,在plugin里搜索GsonFormat,下载并重启 然后在model里的类 按下alts 出现 将…

TFS在项目中Devops落地进程(上)

作为一名开发,经过近2年折腾,基于TFS的Devops主线工程大体落地完毕。 在此大体回忆下中间的各种历程。 开始之前简单说下什么是TFS(Team Foundation Server)。 TFS是微软推出的一款ALM(Application Lifecycle Management)管理工具。 透过TFS你将能获取到从代码版本管…

Hadoop生态hive(三)Hive QL介绍

一、表 创建表 CREATE [EXTERNAL] TABLE [IF NOT EXISTS] table_name CREATE TABLE 创建一个指定名字的表。Hive 创建内部表时,会将数据移动到数据仓库指向的路径; EXTERNAL 关键字可以让用户创建一个外部表,在建表的同时指定一个指向实…

抖音上非常火的旋转图快速部署

本教程不需要你有服务器! 本教程不需要你有服务器! 本教程不需要你有服务器! 点击我看旋转图 总共两步 1、注册一个码云账号 2、新建一个仓库,上传文件即可 1、注册账号的话,直接浏览器搜索码云,手机号…

Microsoft的现代数据管理

PASS 2017峰会是面向SQL Server及Microsoft相关数据技术用户的大会。在大会的第一天,Microsoft的Rohan Kumar先生到场做了开幕式的主题演讲,并借此机会展示了Microsoft在SQL Server和Azure数据库方面的最新进展。 Kumar的演讲涉及数据、人工智能和云这三…

vue 3.4x以上如何改变项目运行端口号

我用3.4版本的vue-cli构建了一个vue项目,然后我想修改项目运行之后的访问端口 在网上查了一下,很多都是2.0的版本,查来查去都说是什么在 config目录下index.js文件中修改端口号。。。。。。。 都抄来抄去的 新的vue项目目录结构下并没有con…

Unable to instantiate org.apache.hadoop.hive.ql.metadata.SessionHiveMetaStoreClient

转载自 Unable to instantiate org.apache.hadoop.hive.ql.metadata.SessionHiveMetaStoreClient hive初始化(mysql为元数据库)完成后,执行SQL语句报错 经过各种查询资料,找到了一种解决办法,大家可以参考。 首先进…

Asp.net core应用在 Kubernetes上内存使用率过高问题分析

原文:https://blog.markvincze.com/troubleshooting-high-memory-usage-with-asp-net-core-on-kubernetes/ ps:我不是死板翻译原文的,尽量的通俗一点,如有不对欢迎指出,谢谢哈。 在生产环境中,我们把asp.ne…

vue cli 4.x打包后如何部署到tomcat服务器上

使用npm run build打包好dist后,不能直接打开里面的index.html,否则页面是一片空白 这时候我们就需要用服务器来代理我们的页面,可以使用ningx,tomcat,或者apache,这里我们使用tomcat当作范例 找到tomcat的…

依赖注入和控制反转

概念 IoC——Inversion of Control 控制反转 DI——Dependency Injection 依赖注入 要想理解上面两个概念,就必须搞清楚如下的问题: 参与者都有谁? 依赖:谁依赖于谁?为什么需要依赖? 注入:…

Hadoop生态Flume(一)介绍

一、概述 Apache Flume是一个分布式,可靠且可用的系统,用于有效地收集,聚合大量日志数据并将其从许多不同的源移动到集中式数据存储中。 Apache Flume的使用不仅限于日志数据聚合。由于数据源是可定制的,因此Flume可用于传输大量…

centos7安装最新版node

为了在linux服务端运行前端以及node后端项目,就必须在服务器上安装node了 但是想要运行前端项目版本就必须是8.x以上的,所以我们干脆安装最新的node 下载 进入下面的官方网站 https://nodejs.org/en/download/ 点击64位的Linux下载 复制该网址 这里以…