使用过 nginx 的小伙伴应该都知道,这个中间件是可以设置跨域的,作为今天的主角,同样的 反向代理中间件的 YARP 毫无意外也支持了跨域请求设置。
有些小伙伴可能会问了,怎样才算是跨域呢?
在 HTML 中,一些标签,例如 img、a 等,还有我们非常熟悉的 Ajax,都是可以指向非本站的资源的,那什么是非本站呢,不同域名、不同端口、还有 http和 https,其中一个不一样,都是属于跨域请求。
简单来说,就是 协议 + 域名 + 端口号,三者一致为同域,否则跨域。
而因为跨域可能会被利用进行 CSRF 攻击,做过安全扫描的应该对这个非常熟悉,除非被请求站点允许跨域请求,否则浏览请将会限制这些请求,而什么是 CSRF 攻击呢,下面我摘抄一段介绍:
跨站请求伪造(英语:Cross-site request forgery),也被称为 one-click attack 或者 session riding,通常缩写为 CSRF 或者 XSRF, 是一种挟制用户在当前已登录的Web应用程序上执行非本意的操作的攻击方法。跟跨网站脚本(XSS)相比,XSS 利用的是用户对指定网站的信任,CSRF 利用的是网站对用户网页浏览器的信任。
攻击细节
言归正传,我们来看看 YARP 是怎么实现 CORS 的:
1、在配置中设置跨域策略
{ "ReverseProxy": { "Routes": { "route1" : { "ClusterId": "cluster1", "CorsPolicy": "customPolicy",//跨域策略名称,具体策略需要在代码中编写,名称大小写不敏感 "Match": { "Hosts": [ "localhost" ] }, } }, "Clusters": { "cluster1": { "Destinations": { "cluster1/destination1": { "Address": "https://localhost:10001/" } } } } } }
我翻阅了资料,发现这个非常的无语(当然可能是我没找到,有新发现的大佬请告知一下我),配置中只是指定了跨域策略的名称,具体的策略内容却没有,而是需要在代码里面编写,实际上的处理,还是在 CORS 中间件上处理,还真的是能少造轮子就少造(当然,我是非常支持这样的理念的)。
2、在 Startup 中编写策略
Startup.cs ConfigureServices
public void ConfigureServices(IServiceCollection services) { services.AddCors(options => { options.AddPolicy("customPolicy", builder => { builder.AllowAnyOrigin(); }); }); }
千万别忘了在请求管道里也要加上 Cors 中间件噢,需要注意的是 要在 Routing 中间件后加上
public void Configure(IApplicationBuilder app) { app.UseRouting(); app.UseCors(); app.UseEndpoints(endpoints => { endpoints.MapReverseProxy(); }); }
具体 cors 怎么用,我就不一一说了,感兴趣的可以到官方文档上看看,传送门
感谢大佬们的观看,我们下次再见,拜拜!