竹笋

首页 » 问答 » 环境 » 什么是CSRF令牌
TUhjnbcbe - 2024/8/19 18:16:00

译者:陈峻

跨站点请求伪造(Cross-siterequestforgery,又称:跨站点引用伪造)是一种针对Web应用的攻击形式。黑客通过伪装恶意请求,诱骗用户运行他们本不打算执行的任务。尽管CSRF可能听起来与XSS攻击类似,但它们的执行方式存在根本差异。对此,Web服务器需要一种机制,来确定浏览器所产生的请求,是否源于合法用户的真实意图,而非受攻击的胁迫。

针对此类问题,服务器端可以生成一个唯一的、且不可预测的密钥值,作为CSRF令牌被包含在客户端的HTTP请求中。当有后续请求发出时,Web服务器会验证包含了令牌的请求参数,以拒绝那些不包含有令牌的请求参数。由于黑客几乎不可能构造一个完整、有效的HTTP请求来欺骗Web用户,因此该方法通常可被用于防范CSRF攻击。

下面,我将和您讨论CSRF令牌的工作原理,及其在应用安全中的重要性。

一、为什么需要有效的CSRF令牌?

CSRF令牌通常被建议添加到所有状态更改(state-changing)的请求中,以便在后端被执行验证。由于只有应用服务器和客户端可以识别令牌,因此后端必须确保传入的请求包含有效的CSRF令牌,以避免XSS或跨站点请求伪造攻击的得逞。

在基于Cookie的会话期间,作为密钥值的CSRF令牌需要被安全处理以保持有效。为此,令牌应当被放置在HTML表单的隐藏字段中,被传输到客户端,并使用HTTP的POST请求被提交。作为优秀的实践,我们建议使用标准的标头来验证请求的来源,并使用其他措施去识别和比较来源和目标。如果来源匹配,则判定请求是合法的;如果不匹配,则表明疑似跨域请求,应予以丢弃。

二、CSRF令牌在防止攻击中的意义

由于令牌在生成过程中使用到了伪随机数(pseudo-randomnumber)生成器、静态密钥、以及种子时间戳,因此CSRF令牌的值是不可预测的。同时,每个用户的令牌也是不同的,而且只会存储活动的用户会话。

据此,安全团队可以通过将随机数生成器的输出,与用户特定的熵(entropy)连接起来,并对整个结构进行散列处理,以提高令牌值的唯一性。对此,黑客将很难在早期的会话Cookie中,根据已发布的令牌样本,去猜测CSRF令牌。

三、如何使用CSRF令牌

尽管我们可以在URL查询字符串中放置令牌,但是查询的字符串记录会被留存在服务器和客户端的多条记录中。因此,查询字符串可以在客户端屏幕的浏览器上被访问到,甚至会在HTTP引用标头中,被传输给第三方应用程序。可见,这种方法是不安全的。

对此,我们建议CSRF令牌应该被存储在服务器端的应用程序中,并在自定义请求标头中传输CSRF令牌。服务器端应用程序通过按需验证每个请求,以确保各种有效的请求,包含了与用户活动会话中存储的值相匹配的令牌。同时,CSRF令牌也可以对包括POST、PUT和DELETE在内的所有HTTP方法执行验证。

四、如何在Java中实现CSRF令牌

由于Java应用缺乏了针对CSRF攻击的固有保护。因此,我们建议在Java中实现CSRF令牌的时候,请使用一个过滤器和一些辅助类,来启用令牌的创建、资源的分析、以及响应的构建。例如,您可以使用通用无状态(GenericStateless)过滤器,来实现了双重提交(double-submit)的Cookie模式,以启用CSRF保护。

同时,您可以采用如下工作流程:首先,如下面代码段所示,过滤器会在Java应用的web.xml文件中被定义:

复制

filterfilter-nameCSRFFilter/filter-namefilter-class

1
查看完整版本: 什么是CSRF令牌