关于搭配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;  的详细用法 这里不做描述 百度上有很多。

  • 0
    点赞
  • 4
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值