艾伟_转载:ASP.NET Forms验证的安全性问题研究——为什么加密代码需要配置为服务

本文涉及的产品
密钥管理服务KMS,1000个密钥,100个凭据,1个月
简介: 申明:这个帖子不是要你去干啥坏事,就是提醒一下你可能会遇到的安全性问题。ASP.Net提供了内置的登录验证,最为常用的就是Forms验证。讲解如何配置的文章非常多,这里就不再讲如何配置使用这个验证的方式了。

申明:这个帖子不是要你去干啥坏事,就是提醒一下你可能会遇到的安全性问题。

ASP.Net提供了内置的登录验证,最为常用的就是Forms验证。讲解如何配置的文章非常多,这里就不再讲如何配置使用这个验证的方式了。下面讲讲其在安全性上存在的一些被忽视的问题。其实它本身没有问题,而使用的方式上会附带出来一些问题。

本文将分三部分讲实际应用中将会遇到的安全性问题,并且加以研究,并尝试提出解决方案。

一、简单的Forms被破解危机
二、垂直划分站点的Forms被破解危机
三、危机将带来什么后果

 

 一、简单的Forms被破解危机

最简单的一个Forms验证,在web.config下配置节点:

 

  <authentication mode="Forms">
<forms name=".MyCookies"></forms>
</authentication>

 

编写一个帮助类:

CookieHelper类
    public static class CookieHelper {
        
public static string Encrypt(string name, string value) {
            FormsAuthenticationTicket ticket 
= new FormsAuthenticationTicket(1, name, DateTime.Now, DateTime.Now.AddDays(1), true, value, "/");
            
string authTicket = FormsAuthentication.Encrypt(ticket);
            
return authTicket;
        }

        
public static void Set(string name, string value) {
            HttpCookie cookie 
= new HttpCookie(FormsAuthentication.FormsCookieName, Encrypt(name, value));
            cookie.Expires 
= DateTime.Now.AddDays(1);
            
if (HttpContext.Current.Response.Cookies[FormsAuthentication.FormsCookieName] == null)
                HttpContext.Current.Response.Cookies.Add(cookie);
            
else
                HttpContext.Current.Response.Cookies.Set(cookie);
        }

        
public static string Get() {
            
if (HttpContext.Current.Request.Cookies[FormsAuthentication.FormsCookieName] == null)
                
return null;
            
else {
                
return HttpContext.Current.Request.Cookies[FormsAuthentication.FormsCookieName].Value;
            }
        }

        
public static FormsAuthenticationTicket Decrypt(string value) {
            
return FormsAuthentication.Decrypt(value);
        }
    }

建立站点SiteA

建立站点SiteB

在SiteA的页面设置Cookie:

CookieHelper.Set("yurow", "123123");

OK!这样,就在SiteA建立了一份Cookie,这个本身并没有任何问题。但是我们往往忽视了一些问题,大家看到,我在CookieHelper类里提供了Decrypt方法,这个方法可以解密Cookie。问题就在于这里!怎么?不知道?那就让贫道来跟施主解释。在这样的网站下,我进行以下的操作步骤:
1、我注册一个帐号;
2、我用这个帐号登录(方便起见,我使用Firefox);
3、打开Firebug,并且启用该网站的网络监视;
4、刷新登录后的页面;
5、在该页面被监视的HTTP头中可以看到一段Cookie密文。例如:

.MyCookie=32DDE0B4E858248037E4D082EF7E9C9BC607B7AA878F8DD
7DE7C13630A5A38FD9A9DA89B709E79F97D05DEEFC9D55A45D29051D
66955439055D01476E8659E34ABDB42FA0018020194F26618FE74E11B
 这样的字符串。

OK,在该网站的操作到此为止。现在在SiteB中建立一个页面,中间加上一个输入框,一个按钮,并且编写以下事件:

解密代码
        protected void Button1_Click(object sender, EventArgs e) {

            
string text = TextBox1.Text;

            
if (!string.IsNullOrEmpty(text)) {

                FormsAuthenticationTicket ticket 
= CookieHelper.Decrypt(text);

                Type type 
= ticket.GetType();

                PropertyInfo[] properties 
= type.GetProperties();

                StringBuilder sb 
= new StringBuilder();

                
foreach (PropertyInfo propertie in properties) {

                    
string name = propertie.Name;

                    
string val = propertie.GetValue(ticket, null).ToString();

                    sb.Append(name);

                    sb.Append(
":");

                    sb.Append(val);

                    sb.Append(
"\r\n");

                }

                
//textBox2.Text = sb.ToString();

                Response.Write(sb.ToString());

            }

        }

把上面的Cookie密文,等于后面的部分复制到SiteB页面中,点解密按钮,看到了什么?
Version:1 Name:yurow Expiration:2009-9-23 19:12:44 IssueDate:2009-9-22 19:12:44 IsPersistent:True Expired:False UserData:123123 CookiePath:/ 

怎么样?所有的信息都被解密了!不过好像高兴地太早了,解密了自己的数据有啥用啊,又拿不到别人的Cookie密文。暂且打住,接下来先讲垂直划分站点安全隐患。

二、垂直划分站点的Forms被破解危机

垂直划分站点其外在表现一般是多域名的N多站点。比如博客园的space.cnblogs.com,news.cnblogs.com等等。而上面第一部分的描述中,贫道似乎漏掉了关于设置machineKey的问题,那是因为要留到这里来讲,要是上面都说了,现在讲啥?

是的,我们是可以在web.config中设置

 

这样的节点。如果在A站点设置了这个,除非B站点也设置相同KEY的节点,否则SiteB将无法正确解密SiteA产生的Cookie密文。似乎一般的网站都设置了这个,好像我们不需要为此而担心了嘛!

是的,一般情况是这样的。但是,很多公司的人员流动性是较大的,而且垂直分割的站点中,可以接触到web.config的人我相信是非常多的。这就能让某些人,(当然,不包括贫道,嘿嘿)就可以比较容易地拿到这个关键的数据。这个数据能干啥?那还用说啊?我在SiteB我自己建立的站点的Web.config也配置上这个节点,那就可以轻易解开目标网站的Cookie密文。为了保证这方面的安全性不得不把Cookie加密解密部分做成服务,不但容易更新,而且让尽可能少的人接触,防止安全性上的问题被放大。要不然,有个人离职啊,或者电脑中毒啊,最好还是要改动改动machineKey,否则呢?否则就有可能出问题。出什么问题呢?这就是下面要讲的。

三、危机将带来什么后果

加密的Key泄露,会带来什么后果?后果很严重。从上面的例子可以看到这个站点Cookie密文包含的关键信息。而是要CookieHelper类,根据这些关键信息,我们就可以轻易地制造出一个Cookies密文。而拿这个Cookies密文写入目标网站的Coookies中,那么就会认为你已经登录。并且这个(这里我们用的验证可能是Cookie保持的用户名或者ID一类的东西。)用户名可以随意伪造,也就是可以用不存在的用户进行发帖!如果你每次在发帖等操作进行验证无疑是增加了服务器的负担,而最好的办法当然是不外泄加密KEY了。这种方式不当可以伪造用户(几个月前我专门试过一些站点是可以的,而伪造用户发帖会造成该论坛的某个版面甚至首页无法访问),而且可以伪造成管理员的帐号。不难想象,如果用其它用户的帐号或者管理员的帐号进行随意发帖,会造成怎么样的恶劣影响了吧?

OK,意识到问题了吧?那贫道就不再多说了。

目录
相关文章
|
6月前
|
存储 数据安全/隐私保护
.NET Core 究竟隐藏着怎样的神秘力量,能实现强身份验证与数据加密?
【8月更文挑战第28天】在数字化时代,数据安全与身份验证至关重要。.NET Core 提供了强大的工具,如 Identity 框架,帮助我们构建高效且可靠的身份验证系统,并支持高度定制化的用户模型和认证逻辑。此外,通过 `System.Security.Cryptography` 命名空间,.NET Core 还提供了丰富的加密算法和工具,确保数据传输和存储过程中的安全性。以下是一个简单的示例,展示如何使用 .NET Core 的 Identity 框架实现用户注册和登录功能。
50 3
|
6月前
|
存储 缓存 NoSQL
【Azure Redis 缓存】关于Azure Cache for Redis 服务在传输和存储键值对(Key/Value)的加密问题
【Azure Redis 缓存】关于Azure Cache for Redis 服务在传输和存储键值对(Key/Value)的加密问题
|
2月前
|
算法 Java 测试技术
使用 BenchmarkDotNet 对 .NET 代码进行性能基准测试
使用 BenchmarkDotNet 对 .NET 代码进行性能基准测试
62 13
|
6月前
|
API
【Azure 媒体服务】Media Service的编码示例 -- 创建缩略图子画面的.NET代码调试问题
【Azure 媒体服务】Media Service的编码示例 -- 创建缩略图子画面的.NET代码调试问题
|
2月前
|
开发框架 .NET PHP
ASP.NET Web Pages - 添加 Razor 代码
ASP.NET Web Pages 使用 Razor 标记添加服务器端代码,支持 C# 和 Visual Basic。Razor 语法简洁易学,类似于 ASP 和 PHP。例如,在网页中加入 `@DateTime.Now` 可以实时显示当前时间。
|
3月前
|
敏捷开发 缓存 中间件
.NET技术的高效开发模式,涵盖面向对象编程、良好架构设计及高效代码编写与管理三大关键要素
本文深入探讨了.NET技术的高效开发模式,涵盖面向对象编程、良好架构设计及高效代码编写与管理三大关键要素,并通过企业级应用和Web应用开发的实践案例,展示了如何在实际项目中应用这些模式,旨在为开发者提供有益的参考和指导。
51 3
|
4月前
|
前端开发 JavaScript C#
CodeMaid:一款基于.NET开发的Visual Studio代码简化和整理实用插件
CodeMaid:一款基于.NET开发的Visual Studio代码简化和整理实用插件
|
5月前
|
安全 Java 数据安全/隐私保护
- 代码加密混淆工具-Java 编程安全性
在Java编程领域,保护代码安全与知识产权至关重要。本文探讨了代码加密混淆工具的重要性,并介绍了五款流行工具:ProGuard、DexGuard、Jscrambler、DashO 和 Ipa Guard。这些工具通过压缩、优化、混淆和加密等手段,提升代码安全性,保护知识产权。ProGuard 是开源工具,用于压缩和混淆Java代码;DexGuard 专为Android应用程序设计,提供强大加密功能;Jscrambler 基于云,保护Web和移动应用的JavaScript及HTML5代码;DashO 支持多种Java平台和
289 1
|
6月前
|
Kubernetes 监控 Devops
【独家揭秘】.NET项目中的DevOps实践:从代码提交到生产部署,你不知道的那些事!
【8月更文挑战第28天】.NET 项目中的 DevOps 实践贯穿代码提交到生产部署全流程,涵盖健壮的源代码管理、GitFlow 工作流、持续集成与部署、容器化及监控日志记录。通过 Git、CI/CD 工具、Kubernetes 及日志框架的最佳实践应用,显著提升软件开发效率与质量。本文通过具体示例,助力开发者构建高效可靠的 DevOps 流程,确保项目成功交付。
118 0
|
6月前
|
XML 开发框架 .NET
.NET框架:软件开发领域的瑞士军刀,如何让初学者变身代码艺术家——从基础架构到独特优势,一篇不可错过的深度解读。
【8月更文挑战第28天】.NET框架是由微软推出的统一开发平台,支持多种编程语言,简化应用程序的开发与部署。其核心组件包括公共语言运行库(CLR)和类库(FCL)。CLR负责内存管理、线程管理和异常处理等任务,确保代码稳定运行;FCL则提供了丰富的类和接口,涵盖网络、数据访问、安全性等多个领域,提高开发效率。此外,.NET框架还支持跨语言互操作,允许开发者使用C#、VB.NET等语言编写代码并无缝集成。这一框架凭借其强大的功能和广泛的社区支持,已成为软件开发领域的重要工具,适合初学者深入学习以奠定职业生涯基础。
129 1