栏目分类:
子分类:
返回
名师互学网用户登录
快速导航关闭
当前搜索
当前分类
子分类
实用工具
热门搜索
名师互学网 > IT > 系统运维 > 运维 > Linux

关于搭配nginx,后台服务器使用request.getServerName()获取服务名的正确配置

Linux 更新时间: 发布时间: IT归档 最新发布 模块sitemap 名妆网 法律咨询 聚返吧 英语巴士网 伯小乐 网商动力

关于搭配nginx,后台服务器使用request.getServerName()获取服务名的正确配置

问题来源

    为了解决CSRF跨站请求伪造,防止接口被恶意攻击

解决办法 

      验证HTTP请求的Referer是不是本服务器链接过来的

客户端或者浏览器在发送请求的时候 都会在请求头存在一个来源指向

Referer 就是当前服务的来源指向

如果是地址栏是 这样的 http://127.168.1.2:8000/index.thml

那么Referer 服务来源也是 http://127.168.1.2XXXXXXXXXX

发现被黑客篡改 关于篡改原因请看这篇文章 http请求头中Referer的含义和作用  

本文重点不是讲这个原理

我这边写了一个对 http请求头中referer中的判断

String serverName = request.getServerName();
String referer = request.getHeader("Referer");
    if (StringUtils.isNotEmpty(referer)){
        if (!referer.contains(serverName)){
            return false;
        }
    }

这段代码就是如果发现有伪造的请求过来 那么就直接返回false网关就不会继续转发服务

这个是写在网关里面的一个过滤器的 奇怪就是在本地  我的serverName 获取 与 referer 中所包含的地址是一样的。

但是放到测试环境就一直返回false

然后去服务器一看

日志显示 ---- 服务名:127.0.0.1,来源信息:https://101.168.202.1:8080/XXX

request.getServerName()  获取出来的是 127.0.0.1 但是请求头中的来源却是真实的IP

这样肯定不包含在内 所以就一直会是false

分析了好长一段时间 才发现 原来是测试环境有nginx 而本地是没有的

nginx反向代理的都是127.0.0.1  所以request.getServerName() 获取就是127.0.0.1  要想让request.getServerName()获取真是的IP 那就需要在nginx配置文件加上 

server{

proxy_set_header Host $host; # 这样一行配置

}

proxy_set_header Host $host; 

这个的意思是 这一行的作用是把原http请求的Header中的host字段也放到转发的请求里。

这样 就能保证nginx发送网关的时候 request.getServerName() 获取的就是你服务的真正的名字 而不是代理的127.0.0.1 

我加上之后重新启动nginx之后  

日志显示 ---- 服务名:101.168.202.1,来源信息:https://101.168.202.1:8080/XXX

这样就对了

关于proxy_set_header Host $host;  的详细用法 这里不做描述 百度上有很多。

转载请注明:文章转载自 www.mshxw.com
本文地址:https://www.mshxw.com/it/450313.html
我们一直用心在做
关于我们 文章归档 网站地图 联系我们

版权所有 (c)2021-2022 MSHXW.COM

ICP备案号:晋ICP备2021003244-6号