首页 程序笔记 跨站点请求伪造(CSRF)

跨站点请求伪造(CSRF)

CSRF(Cross-site request forgery跨站请求伪造,也被称成为“one click attack”或者session riding,通常缩写为CSRF或者XSRF,是一种对网站的恶意利用。

说的白话一点就是,别的站点伪造你的请求。下面有个经典的实例,了解一下跨站点请求伪造到底是怎么是实现的:

受害者:Paul

黑客:Jack

银行:bank

Paul在银行有一笔存款,可以通过请求http://bank.com/withdraw?account=bob&amount=1000000&for=Linda把钱转到Linda下。通常情况下,该请求到达网站后,服务器会验证请求是否来自一个合法的session,并且该session的用户Paul已登录。Jack在该银行也有账户,于是他伪造了一个地址http://bank.com/withdraw?account=Paul&amount=1000000&for=Jack,但是如果直接访问,服务器肯定会识别出当前登录用户是Jack而不是Paul,不能接受请求。于是通过CSRF攻击方式,将此链接伪造在广告下,诱使Paul自己点这个链接,那么请求就会携带Paul浏览起的cookie一起发送到银行,而Paul同时又登录了银行或者刚刚登录不久session还没有过期,那服务器发现cookie中有Paul的登录信息,就接收了响应,攻击就成功了

本文以.NET为例,主要阐述服务端如何防御跨站点请求伪造(CSRF)

1、验证Referer

if (Request.UrlReferrer == null)
{
    throw new Exception("请求来源异常");
}
else
{
    if (Request.UrlReferrer.Host != Request.Url.Host)
    {
        throw new Exception("请求来源异常");
    }
}

代码中检查了请求来源与当前Host是否相同,如果UrlReferrer为空或者与当前Host不同则抛出异常。用这样的方法防止跨站点请求伪造比较简单粗暴,但是UrlReferrer是可以伪造的。

2、在请求参数中添加token验证

例如在一个表单提交页面,可以先生成一个CsrfToken,CsrfToken可以保存在Session中,表单提交时带上这个Token值。接收表单时,检查提交过来的Token与Session中的Token是否一致,如果一致在对表单进行处理。这样可以防止伪造的请求,示例代码如下:

if (Session["CsrfToken"] == null)
{
    throw new Exception("请求异常,请重试");
}
string csrfToken = Session["CsrfToken"].ToString();
Session["CsrfToken"] = null;
if (Request["CsrfToken "]!= csrfToken)
{
    throw new Exception("请求异常,请重试");
}

这样做还能防止重复提交。

3、HTTP头中自定义属性并验证

这个方法和上面那个类似,也是设置token,只是把token设置为HTTP头中的自定义属性。

通过XMLHttpRequest可以一次性给所有该类请求的HTTP头加上token 属性,但是XMLHttpRequest请求通常用于Ajax方法对局部页面的异步刷新,比较有局限性;而且通过XMLHttpRequest请求的地址不会被记录到浏览器的地址栏,一方面不会通过Referer泄露token,另一方面会导致前进,后退,刷新,收藏等操作失效,所以还是慎用。

个人认为通过Referer和Token方案结合起来使用,能够比较好的防止跨站点请求伪造(CSRF)

1

站心网

CSRF(Cross-site request forgery跨站请求伪造,也被称成为“one click attack”或者session riding,通常..

为您推荐

.NET Core Razor Page ajax请求返回400 Bad request

Razor页面被设计为默认启动防跨站请求伪造攻击的,防伪令牌生成和验证被自动包含在Razor页面中。打开页面可以看到表单里有一个隐藏的input<input name="__RequestVerificationToken" type="hidden" value="CfDJ8JOah..

ASP.NET Core MVC/RazorPage使用Anti-Forgery Tokens进行XSRF/CSRF防护

ASP.NET Web Stack运行时使用同步器令牌模式的变体来抵御XSRF攻击。同步器令牌模式的一般形式是,除了身份验证令牌):一个令牌作为Cookie,另一个作为表单值,两个反XSRF令牌提交到服务器。服务器在两个令牌通过比较..

.NET Core MVC判断是否是ajax请求

在ASP.NET Core MVC中,可以通过检查请求头中是否包含X-Requested-With标头来判断请求是否为Ajax请求。可以使用以下代码来检查:if(Request.Headers["X-Requested-With"] == "XMLHttpRequest"){// 处理Ajax请求的逻..

.NET Core获取请求者真实IP

在.NET Core中,可以通过访问HttpContext中的RemoteIpAddress属性来获取请求者的IP地址。代码示例如下:public IActionResult MyAction(){var remoteIpAddress = HttpContext.Connection.RemoteIpAddress;return Vie..

.NET Core记录请求处理时间的中间件

以下是一个示例的 .NET Core 中间件,用于记录请求处理时间的情况:using Microsoft.AspNetCore.Http;using Microsoft.Extensions.Logging;using System;using System.Diagnostics;using System.Threading.Tasks;pub..

.NET Core怎么判断请求类型

NET Core 中可以通过以下方法判断请求类型:使用 HttpRequest.Method 属性:HttpRequest.Method 属性可以获取请求方法,例如 GET、POST、PUT、DELETE 等。var request = HttpContext.Request;if (request.Method == ..

C# HttpClient发送http请求上传文件

在C#7.1之后,net推出HttpClient类代替WebRequest, HttpWebRequest, ServicePoint, and WebClient。GetAsync(String)以异步操作将 GET 请求发送给指定 URI。普通的get请求获取请求消息 返回的HttpResponseMessage包含..

.NET Core限制请求频率中间件 AspNetCoreRateLimit

在.NET Core中,我们可以使用ASP.NET Core的中间件来对Web API进行流量限制。ASP.NET Core提供了一个名为RateLimit的开源库,可以方便地实现流量限制功能。下面将详细介绍如何在.NET Core中使用RateLimit库对Web API..

.NET Core判断发起请求的设备

.NET Core 可以通过以下方法判断发起请求的设备:使用 HttpRequest.UserAgent 属性HttpRequest.UserAgent 属性可以获取发起请求的用户代理字符串。用户代理字符串包含有关发起请求的设备的信息,例如设备类型、操作..

Vue中使用Mock.js模拟接口请求数据

在Vue项目中使用Mock.js可以方便地模拟接口数据,用于前端开发和测试。Mock.js是一个生成随机数据的库,可以帮助我们快速构建虚拟接口数据。在本文中,我将通过一个实例来详细讲解在Vue中使用Mock.js虚拟接口数据的..

System.Net.WebException:请求被中止: 未能创建 SSL/TLS 安全通道

C# WebClient.DownloadData报错 System.Net.WebException: 请求被中止: 未能创建 SSL/TLS 安全通道。这个错误通常表示在尝试建立 SSL/TLS 安全通道时出现了问题。这可能是由于以下原因之一导致的:目标服务器不支持..

如何防止CSRF跨站请求伪造攻击

CSRF攻击即跨站请求伪造(Cross-Site Request Forgery),它是一种网络攻击,攻击者通过伪造来自受信任用户的请求来攻击受信任的网站。CSRF攻击利用了web中的用户身份认证验证漏洞,即虽然可以保证请求发自某一用户的..

.NET Core本地调试101 Switching Protocols是什么请求?

今天在调试.NET6网站时发现network里有101状态的请求,看内容是aspnetcore-browser-refresh.js发起的。Aspnetcore-browser-refresh.js 是一个 JavaScript 文件,由 ASP.NET Core 使用来实现热重载功能。热重载允许开..

发表回复

返回顶部