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,意识到问题了吧?那贫道就不再多说了。

时间: 2024-12-30 10:01:03

ASP.NET Forms验证的安全性问题研究为什么加密代码需要配置为服务的相关文章

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

申明:这个帖子不是要你去干啥坏事,就是提醒一下你可能会遇到的安全性问题. ASP.Net提供了内置的登录验证,最为常用的就是Forms验证.讲解如何配置的文章非常多,这里就不再讲如何配置使用这个验证的方式了.下面讲讲其在安全性上存在的一些被忽视的问题.其实它本身没有问题,而使用的方式上会附带出来一些问题. 本文将分三部分讲实际应用中将会遇到的安全性问题,并且加以研究,并尝试提出解决方案. 一.简单的Forms被破解危机二.垂直划分站点的Forms被破解危机三.危机将带来什么后果    一.简单的

ASP.NET Forms验证实现子域名(SubDomain)共享登陆下的缺陷

一.什么是单点登录 单点登录就是在多个web应用程序中,实现统一登录方式,一但登录了某web应 用程序,其它相关联的web应用程序都无需再次登录,一个地方退出,所有相关联的 web应用程序都退出. 二.通过利用ASP.NET Forms验证模式可以实现子域名(SubDomain)共享登陆下 的缺陷 要利用Asp.NET Form验证模式实现同一主域下不同子域名共享登陆状态需要进 行以下配置 配置Web.config 1.把Asp.net的认证模式改为Forms认证模式,domain 要等于你的应

当ASP.NET Forms验证方式遭遇苹果IOS

一.问题出现 我在用ASP.NET MVC4做微信开发的时候,用Forms验证方式做为authentication. 一般都是在web.config加: <authentication mode="Forms" > <forms loginUrl="~/Account/Login" name="webcookies"  slidingExpiration="true" timeout="30&quo

关于asp.net forms验证的问题

问题描述 使用asp.netforms验证方式进行用户登录验证.之前一直都没有问题的,但最近遇到一个很奇怪的问题.不知道是哪里的设置问题,该如何解决.先说问题现象WEB应用程序在测试时,都没有问题,但发布到服务器上以后客户端无法使用IE进行登录,用IE登录后,页面会返回到刷新后的登录页面,取消IE的兼容模式后再测试,就发现问题出在了验证登录后的URL地址上,地址栏里会出现一段代码如下(异常部分用红色标注了):http://www.abc.com/(alkjdfw**aj09jaolakjow90

升级MD5.ASP,打造完全动态不重复的安全加密代码

安全|动态|加密|重复 做一个完全动态的密码,让相同的密码生成不同的结果密码aaa经过第一次运算后结果为:jlce1d65ec3b91556234879c9db8f6da1123第二次:hjmnbe0d01cc1fbd3e18ae7431fa52fb3ce4第三次:grttb05901915e121d83ebefad7e809ef1b0... ...当然,亦可还原比较以下我根据动网MD5函数修改后的代码,'======================================='word

艾伟:ASP.NET安全问题--Forms验证(后篇)--实战篇

       验证流程讲述        我们首先假设一个场景:用户现在已经打开了我们的首页Default.aspx,但是有些资源只能是登录用户才可以看到的,那么如果这个用户想要查看这些资源,那么他就要登录.而且这个用户已经有了一个帐号.(我们本篇主要的话题是身份验证,至于创建用户账户是怎么创建的,我们不关心,方法很多,如直接一个数据库插入就行了!)        我们现在就把我们的一些流程说下:       1.用户登录,在输入框中输入用户名和密码信息       2.点击登录按钮后,到数据库

用IIS+ASP+Access构建网站的安全性分析

access|asp+|iis|安全|安全性     随着Internet的发展,Web技术日新月异,人们已经不再满足于静态HTML技术,更多的是要求动态.交互的网络技术.继通用网关接口(CGI)之后,微软推出的IIS+ASP的解决方案作为一种典型的服务器端网页设计技术,被广泛应用在网上银行.电子商务.网上调查.网上查询.BBS.搜索引擎等各种互联网应用中.与此同时,Access数据库作为微软推出的以标准JET为引擎的桌面型数据库系统,由于具有操作简单.界面友好等特点,具有较大的用户群体.目前,

[.NET 基于角色安全性验证] 之三:ASP.NET Forms 身份验证

在开发过程中,我们需要做的事情包括: 1. 在 web.config 中设置 Forms 身份验证相关参数.2. 创建登录页. 登录页中的操作包括: 1. 验证用户名和密码是否正确.2. 创建身份验证票证对象.3. 将身份验证票证对象加密成字符串,写入 Cookies.4. 重定向到原始请求 URL. 1. 简单演示 web.config <?xml version="1.0"?><configuration>  <system.web>    &l

使用ASP.Net Forms模式实现WebService身份验证

asp.net|web     在安全性要求不是很高的ASP.Net程序中,基于Forms的身份验证是经常使用的一种方式,而如果需要对WebService进行身份验证,最常用的可能是基于Soap 标头的自定义身份验证方式.如果对两者做一下比较的话,显然,基于Forms的验证方式更加方便易用,能否将Forms验证方式应用到WebService中去呢?     从理论上讲,使用基于Forms的方式对WebService进行身份验证是可行的,但是使用过程中会存在以下两个问题: 1.基于Forms的验证