python3-requests偽造x-forwarded-for以及解決


通常,我們的服務器會有一級或者多級的反向代理, 因此我們代碼中拿remote_addr會取到最后一級反向代理的ip。為了拿到真實ip,常常會去x-Forward-For中拿用戶最后一級代理Ip。但是由於該值是header中的, 直接去取可能取到用戶偽造的Ip。

x-forwarded-for資料

這一HTTP頭一般格式如下:

X-Forwarded-For: client1, proxy1, proxy2

其中的值通過一個 逗號+空格 把多個IP地址區分開, 最左邊(client1)是最原始客戶端的IP地址, 代理服務器每成功收到一個請求,就把請求來源IP地址添加到右邊。 在上面這個例子中,這個請求成功通過了三台代理服務器:proxy1, proxy2 及 proxy3。請求由client1發出,到達了proxy3(proxy3可能是請求的終點)。請求剛從client1中發出時,XFF是空的,請求被發往proxy1;通過proxy1的時候,client1被添加到XFF中,之后請求被發往proxy2;通過proxy2的時候,proxy1被添加到XFF中,之后請求被發往proxy3;通過proxy3時,proxy2被添加到XFF中,之后請求的的去向不明,如果proxy3不是請求終點,請求會被繼續轉發。

 

 

模擬x-forwarded-for

import requests

url = 'http://xx.a.com/my'

cookies ={'_ga':'GA1.2.1078940745.1527045185'}

headers = {'X-Forwarded-For':'8.8.8.8', 'content-type':'application/json'}

print(headers)

cookies

req = requests.get(url,headers=headers,cookies=cookies)

print(req.content.decode('utf-8'))

 

 

postman 中構造

 

    

 

nginx配置日志格式,方便查看x-forwarded-for字段

   

 

解決方法:在最外層的反向代理處理。

  1.在最外的反向代理上, 將x-forwarded-for替換為remote_addr

  2.也可以定義另外的Header字段,remote_addr 賦值到該字段上,取該值即可,如x-real-ip。

  3.添加remote_addr 到x-forwarded-for最后,取最后的x-forwarded-for即可。

 

此時前端反向代理 收到x-forwarded-for為9.9.9.9

 

后端真實服務器   , 這里能看到 x-forwarded-for 已經不是 9.9.9.9了。 而是真實的xx.xx.xx.239


免責聲明!

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



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