什么是CSRF?

        跨站请求伪造(英语:Cross-site request forgery),也被称为 one-click attack 或者 session riding,通常缩写为 CSRF 或者 XSRF, 是一种挟制用户在当前已登录的Web应用程序上执行非本意的操作的攻击方法。跟跨网站脚本(XSS)相比,XSS 利用的是用户对指定网站的信任,CSRF 利用的是网站对用户网页浏览器的信任。

CSRF攻击利用用户已登录的身份,通过伪造请求执行非法操作,危害极大。通过验证HTTP Referer字段、添加Token验证、使用JSON API、验证码等方法,可以有效防御CSRF攻击,保护用户数据与财产安全。‌

本文由于公司项目复杂,将在nginx中对CSRF攻击进行漏洞修复。

修复原理

通过验证HTTP 请求头中 Referer 字段校验客户端来源。

直接上配置

在nginx Http层,(注意不要在Server层 )中添加以下配置,由于内网中有互相引用的服务,增加了白名单配置。

map $request_uri $referer_white_list_allow {
	default 0;
	#放行的路径,后期可扩展更多白名单路径
	"~*/api/sys/sys-dlp-probe/heart" 1;
}
map $http_referer $is_allowed_referer {
	default 0;
	#校验Referer是否是指定客户端的ip
	"~*^https?://172\.16\.0\.104" 1;
}
map "$referer_white_list_allow:$is_allowed_referer" $allow_request {
    # 如果路径在白名单中,直接允许
    ~^1: 1;
    # 如果路径不在白名单中,但 Referer 校验通过,允许
    ~^0:1 1;
    # 其他情况拒绝
    default 0;
 }

最后,在需要校验路径的location中加入下面的判断

// 如果此变量等于0,说明上面有伪造请求嫌疑,返回错误码
if ($allow_request = 0) {
	return 403 "Forbidden: Invalid Referer or Path";
}

这里用到了nginx中的map方法,将请求头根据下面的条件对变量进行赋值,感兴趣的小伙伴自己研究一下!

Logo

汇聚全球AI编程工具,助力开发者即刻编程。

更多推荐