網上常見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