Asp.net安全架构之3:CSRF(跨站点请求伪造)

简介:

原理

CSRF,Cross Site Request Forgery,即跨站点请求伪造。

这种攻击是指,在用户正常登录系统以后,攻击者诱使用户访问一些非法链接,以执行一些非法操作。比如:如果删除用户操作(如,yourdomain.com/deluser?id=123)没有经过防范CSRF的处理,那么,假设用户登录系统后,攻击者诱使用户同时访问了攻击者的站点的一个链接(该链接正好为yourdomain.com/deluser?id=123),那么,系统就会在用户不知情的情况下丢失一个用户。

在这个例子中,跨站请求中的链接之所以被正常执行,首先是因为请求中浏览器正常发送了yourdomain的认证信息(一般保存在cookie中),服务器根本不知道该请求是用户为之,还是恶意为之。其次,就是请求中的参数是可以被猜测的。这两个条件,构成了CSRF攻击的全部条件。

这里还需要强调一下,如果认证基于cookie,那么实际上还有第三个条件:如果cookie是本地cookie,浏览器还需要允许跨域发送本地cookie,即如果请求是第三方网站发起的,应带上请求的域的cookie。IE默认是不允许跨域发送本地cookie的(session cookie则无此限制),而firefoxe就默认允许的。

原理如图:

应对策略

1:采用token的形式。

采用token是指让请求所带的参数变的不可猜测。即,每次需要保护的请求都要带上一个额外的参数,该参数可以是sessionid(一定要是额外的参数,但是其值可以为sessionid),也可以是另外的无法被猜测的一个值。然后,服务器在得到这个请求后,再验证该值是否匹配。

可能有人会进一步提出,不是sessionid也是可以非法得到的吗,或者说用户的sessionid是没有授权被操作的?答案是没错,但是,那又是另外的攻击方法(涉及到会话劫持和权限欺骗)了,在这里,仅仅防御的是CSRF攻击。

不过为了保险起见,我们可以用sessionid+salt,然后散列的方式来生成这个token。

采用token的形式,我们还需要考虑该token,也就是客户端所带的这个参数的保存问题。从CSRF的本质考虑,token的保存首先不能保存在cookie中,因为cookie本身就是在发送请求的时候可以被带上。

其次,token可以保存在服务器端吗,如,我们可以为当前请求设定一个唯一标识,然后保存在session中。答案当然也是不行的,我们可以假设完成一次请求包含两个部分:发起请求的URL(或程序),处理请求的URL(或程序),诚然,这种方式我们防住了单独请求”处理请求的URL”的CSRF攻击。但是,既然攻击者得到了处理请求的页面,那么,他在伪造CSRF的时候,只要带上了发送请求的页面,就依然可以完成一次攻击。

所以,token的保存只能是保存在发送到客户端的页面中,然后客户端在接下来发送的请求的时候,带上这个参数就可以了。当然,如果页面本身已经被XSS攻破,那么攻击者仍旧可以伪造一次合法请求,但这已经不是防范CSRF的范畴了,而是防范XSS。

2:每次需要被保护的请求发送时,都要求用户输入密码;

3:每次需要被保护的请求发送时,都带上referrer。不过这并不是应对的最佳策略,因为referrer是可以被轻易伪造的。

具体措施

以下具体措施针对token的形式。

n  遍历前台所有发送请求的地方

1:文件查找前台所有的”svc”,”ajax”,”.aspx”,”.html”,”.htm”

2:文件查找前台所有的”form”

根据以上的查找,汇总到如下的表格:

序号

文件

代码行

GET/POST

处理完成否

 

 

 

 

 

n  处理请求

筛选出需要进行CSRF处理的请求。然后对请求做如下处理:

如果是GET方式发送的请求,则为请求加入参数token=[value],其中[value]为sessionid的值;

如果是POST方式发送的请求,则为Form加入隐藏的input,其name为token,其值为sessionid。      

n  遍历所有的请求处理处

1:遍历所有的svc,为svc的方法增加token参数

2:遍历所有的aspx页面的code-behind

3:遍历所有其它的后台方法,如果存在的话,如控制器方法(在EL中并不存在)。

根据以上的查找,汇总到如下的表格

序号

文件

代码行

处理完成否

 

 

 

 

n  处理请求处理处

处理参数中的token,检测该token是否存在于当前的sessionid中,如果存在,则放行,否则异常;

以上全部的逻辑用代码表示,大致如下:

复制代码
        protected void Page_Load(object sender, EventArgs e)
        {
            string token = CreateToken();
            PutTokenToClient(token);
            SaveTokenInServer(token);
        }

        protected void ButtonDosomething_Click(object sender, EventArgs e)
        {
            string token = GetTokenFromRequest();
            //需要csrf保护的地方就check才放行
            if (TokenIsOK(token))
            {
                //todo: go
            }
            else
            {
                //todo: block
            }
        }

        private string GetTokenFromRequest()
        {
            //todo 从请求中得到coken,一般为URL QueryString或表单元素
            throw new NotImplementedException();
        }

        private void PutTokenToClient(string token)
        {
            //todo 将其保存到前台,如请求的url,或隐藏的input
        }

        private void SaveTokenInServer(string token)
        {
            //一般保存在session中
            Session["CRSFToken"] = token;
        }

        private bool TokenIsOK(string token)
        {
            string tokenInServer = Session["CRSFToken"].ToString();
            return tokenInServer == token ? true : false;
        }

        public string _salt = "asdfkl@,.;#sss13131313";

        public string CreateToken()
        {
            return MD5(Session.SessionID + _salt);
        }

        private void ClearToken()
        {
            Session["CRSFToken"] = string.Empty;
        }

        private string MD5(string p)
        {
            throw new NotImplementedException();
    }
复制代码

 本文转自最课程陆敏技博客园博客,原文链接:http://www.cnblogs.com/luminji/archive/2012/06/08/2511384.html,如需转载请自行联系原作者

相关文章
|
9月前
|
缓存 安全 API
【亿级数据专题】「高并发架构」盘点本年度探索对外服务的百万请求量的API网关设计实现
公司对外开放的OpenAPI-Server服务,作为核心内部系统与外部系统之间的重要通讯枢纽,每天处理数百万次的API调用、亿级别的消息推送以及TB/PB级别的数据同步。经过多年流量的持续增长,该服务体系依然稳固可靠,展现出强大的负载能力。
210 9
【亿级数据专题】「高并发架构」盘点本年度探索对外服务的百万请求量的API网关设计实现
|
4天前
|
安全 NoSQL MongoDB
XJ-Survey:这个让滴滴日均处理1.2亿次问卷请求的开源系统,今天终于公开了它的架构密码!
嗨,大家好,我是小华同学。今天为大家介绍一款由滴滴开源的高效调研系统——XJ-Survey。它功能强大,支持多类型数据采集、智能逻辑编排、精细权限管理和数据在线分析,适用于问卷、考试、测评等场景。采用 Vue3、NestJS 等先进技术栈,确保高性能与安全性。无论是企业还是个人,XJ-Survey 都是你不可错过的神器!项目地址:[https://github.com/didi/xiaoju-survey](https://github.com/didi/xiaoju-survey)
40 15
|
2月前
|
JSON 数据格式
.net HTTP请求类封装
`HttpRequestHelper` 是一个用于简化 HTTP 请求的辅助类,支持发送 GET 和 POST 请求。它使用 `HttpClient` 发起请求,并通过 `Newtonsoft.Json` 处理 JSON 数据。示例展示了如何使用该类发送请求并处理响应。注意事项包括:简单的错误处理、需安装 `Newtonsoft.Json` 依赖,以及建议重用 `HttpClient` 实例以优化性能。
89 2
|
6月前
|
开发框架 缓存 .NET
并发请求太多,服务器崩溃了?试试使用 ASP.NET Core Web API 操作筛选器对请求进行限流
并发请求太多,服务器崩溃了?试试使用 ASP.NET Core Web API 操作筛选器对请求进行限流
278 0
|
3月前
|
开发框架 安全 .NET
在数字化时代,.NET 技术凭借跨平台兼容性、丰富的开发工具和框架、高效的性能及强大的安全稳定性,成为软件开发的重要支柱
在数字化时代,.NET 技术凭借跨平台兼容性、丰富的开发工具和框架、高效的性能及强大的安全稳定性,成为软件开发的重要支柱。它不仅加速了应用开发进程,提升了开发质量和可靠性,还促进了创新和业务发展,培养了专业人才和技术社区,为软件开发和数字化转型做出了重要贡献。
58 5
|
9月前
|
缓存 自然语言处理 前端开发
第一章 引言-HTTP协议基础概念和前后端分离架构请求交互概述
第一章 引言-HTTP协议基础概念和前后端分离架构请求交互概述
183 0
|
6月前
|
数据采集 JSON API
异步方法与HTTP请求:.NET中提高响应速度的实用技巧
本文探讨了在.NET环境下,如何通过异步方法和HTTP请求提高Web爬虫的响应速度和数据抓取效率。介绍了使用HttpClient结合async和await关键字实现异步HTTP请求,避免阻塞主线程,并通过设置代理IP、user-agent和cookie来优化爬虫性能。提供了代码示例,演示了如何集成这些技术以绕过目标网站的反爬机制,实现高效的数据抓取。最后,通过实例展示了如何应用这些技术获取API的JSON数据,强调了这些方法在提升爬虫性能和可靠性方面的重要性。
异步方法与HTTP请求:.NET中提高响应速度的实用技巧
|
4月前
|
API
使用`System.Net.WebClient`类发送HTTP请求来调用阿里云短信API
使用`System.Net.WebClient`类发送HTTP请求来调用阿里云短信API
71 0
|
5月前
|
XML Java 数据库
在微服务架构中,请求常跨越多个服务,涉及多组件交互,问题定位因此变得复杂
【9月更文挑战第8天】在微服务架构中,请求常跨越多个服务,涉及多组件交互,问题定位因此变得复杂。日志作为系统行为的第一手资料,传统记录方式因缺乏全局视角而难以满足跨服务追踪需求。本文通过一个电商系统的案例,介绍如何在Spring Boot应用中手动实现日志链路追踪,提升调试效率。我们生成并传递唯一追踪ID,确保日志记录包含该ID,即使日志分散也能串联。示例代码展示了使用过滤器设置追踪ID,并在日志记录及配置中自动包含该ID。这种方法不仅简化了问题定位,还具有良好的扩展性,适用于各种基于Spring Boot的微服务架构。
72 3
|
6月前
|
开发框架 监控 安全
.NET 应用程序安全背后究竟隐藏着多少秘密?从编码到部署全揭秘!
【8月更文挑战第28天】在数字化时代,.NET 应用程序的安全至关重要。从编码阶段到部署,需全面防护以保障系统稳定与用户数据安全。开发者应遵循安全编码规范,实施输入验证、权限管理和加密敏感信息等措施,并利用安全测试发现潜在漏洞。此外,部署时还需选择安全的服务器环境,配置 HTTPS 并实时监控应用状态,确保全方位防护。
81 3

热门文章

最新文章