在RESTful应用程序中防止跨站请求伪造(CSRF)的常见策略主要有以下几种:
1. 使用CSRF令牌(Token)
策略说明: 在服务端生成一个随机的CSRF令牌,并将其嵌入到每一个需要保护的表单中。客户端在提交表单时必须包含这个令牌。服务端会验证这个令牌是否有效,如果令牌不匹配或缺失,请求将被拒绝。
实施例子: 比如在用户登录后,服务器可以在用户的会话中生成一个CSRF令牌,并将此令牌添加到每一个表单中。当表单提交时,服务器检查表单中的令牌与用户会话中的令牌是否一致。
2. 双重提交Cookie
策略说明: 这种方法要求客户端在请求中提交两次相同的信息(如Cookie中的一个值和请求头中的相同的值)。由于同源策略,攻击者无法读取或设置Cookie,因此无法正确构造包含正确信息的请求。
实施例子:
在用户访问网站时,服务器可以设置一个特定的Cookie(比如csrf-token
),同时要求所有的请求都必须在HTTP请求头中包含一个与Cookie值相同的X-CSRF-Token
头。服务器将验证两者是否匹配。
3. 利用SameSite Cookie属性
策略说明:
设置Cookie的SameSite
属性可以防止浏览器在跨站请求时发送Cookie,从而可以防止CSRF攻击。
实施例子:
SameSite=Strict
:Cookie只在同一个站点的请求中发送,完全禁止跨站发送。SameSite=Lax
:在一些情况下(如GET请求)允许跨站发送Cookie,但在会引起状态变更的请求(如POST)中不会发送。
4. 检查Referer和Origin头部
策略说明:
通过验证HTTP请求的Referer
或Origin
头部来确保请求是从受信任的源发起的。
实施例子:
服务器配置安全策略,只接受来自特定域名(例如自家域名)的请求,如果Referer
或Origin
头部的值不是预期的域名,则拒绝该请求。
5. 自定义头部
策略说明: 由于跨站请求无法携带自定义头部,可以要求所有敏感操作必须包含一个自定义的HTTP头部。
实施例子:
服务器要求所有修改数据的请求必须包含一个X-Requested-With: XMLHttpRequest
头部,只有AJAX请求才自动添加这个头部,普通的表单提交是不包含的。
通过上述方法的一个或多个组合,可以有效地增强RESTful应用程序对CSRF攻击的防护。