多層 nginx配置X-Forwarded-For


網上常見nginx配置ip請求頭

  proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;

風險: 用戶可以通過自己設置請求頭來偽造ip,比如用戶在發起http請求是自己測試請求頭x-forwarded-for:192.168.0.151。那么服務器通過x-forwarded-for獲取到的第一個ip就是用戶偽造的ip。

  防止偽造方案:

  情況1: 在只有1層nginx代理的情況下,設置nginx配置“proxy_set_header X-Forwarded-For $remote_addr;”。(此時$remote_addr獲取的是用戶的真是ip)

  情況2:在有多層反向代理的情況下,

                           1)設置“最外層”nginx配置和情況1一樣“proxy_set_header X-Forwarded-For $remote_addr;”。

                           2)除了“最外層”之外的nginx配置“proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;”。

  這樣就防止了用戶通過偽造請求頭來偽造真實ip。后台只需要從x-forwarded-for請求頭中取出第一個ip就是用戶的真實ip。后面如果有多個ip,就是反向代理的ip

 

 

同理:X-Real-IP也差不多。

     不同的是當只有1層nginx代理情況下只需配置“proxy_set_header X-Real-IP $remote_addr;”即可。

     當有多層反向代理時,只在最外層代理設置“proxy_set_header X-Real-IP $remote_addr;”,如果在非最外層設置,則獲取到的是反向代理機器的ip

 

附上代碼:

public static String getIpAddress(HttpServletRequest request) {
        // 從Nginx中x-forwarded-for獲取真實ip
        String ipAddress = request.getHeader("X-Forwarded-For");
        if (ipAddress != null && ipAddress.length() > 0 && !"unknown".equalsIgnoreCase(ipAddress)) {
            // 對於通過多個代理的情況,第一個IP為客戶端真實IP,多個IP按照','分割

            int index = ipAddress.indexOf(",");
            if (index > 0) {
                ipAddress = ipAddress.substring(0, index).trim();
            }
            return ipAddress;
        }
        // 從Nginx中X-Real-IP獲取真實ip
        ipAddress = request.getHeader("X-Real-IP");
        if (ipAddress != null && ipAddress.length() > 0 && !"unknown".equalsIgnoreCase(ipAddress)) {
            return ipAddress;
        }


        ipAddress = request.getRemoteAddr();
        // if ("127.0.0.1".equals(ipAddress) ||
        // "0:0:0:0:0:0:0:1".equals(ipAddress)) {
        // // 根據網卡取本機配置的IP
        // ipAddress = InetAddress.getLocalHost().getHostAddress();
        // }
        return ipAddress;

    }

 原文地址:

https://www.cnblogs.com/wulm/p/9817319.html


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM