剛才問了個nginx轉發upstream改變轉發來源ip的問題,既然存取請求來源的ip可以被隨意改變,那麼我們在web服務端獲得的ip也就是不能完全相信的了,那麼我們應該什麼方式來限制使用者真實ip,還是確實這條路不可行?
剛才問了個nginx轉發upstream改變轉發來源ip的問題,既然存取請求來源的ip可以被隨意改變,那麼我們在web服務端獲得的ip也就是不能完全相信的了,那麼我們應該什麼方式來限制使用者真實ip,還是確實這條路不可行?
nginx是 【你】搭建的,還是要 【被禁止的使用者】 搭建的?
HTTP_X_FORWARD_FOR是可以偽造的,但是 REMOTE_ADDR 是改變不了的。
如果是 【被禁止的使用者】 的搭建的:
你可以透過$_SERVER["REMOTE_ADDR"]可以取得到nginx伺服器的IP,直接封。
如果是 【你】搭建的nginx:
雖然可以透過$_SERVER["HTTP_X_FORWARD_FOR"]取得到使用者的IP,但有可能是偽造的。
<code>proxy_set_header X-Forward-For $remote_addr</code>
最好的方法是增加私有的HTTP頭,nginx轉發時增加私有http頭X-GAGAGA(嘎嘎嘎,猜不到吧),使用$_SERVER["HTTP_X_GAGAGA"]獲取,這樣攻擊這即使祥偽造,也不知道需要偽造啥。
<code>proxy_set_header X-GAGAGA $remote_addr</code>
另外,阿里旗下WW現在御用的代理平台HL系統因為HTTP_X_FORWARD_FOR過濾不嚴,精心構造請求可注入。 。 。 (現在新版已經修復)
關於偽造,如果 你用的 Linux/Unix/OSX,自帶的curl就可以實現:
<code>curl abc.com/test.php -H "X-FORWARD-FOR:8.8.8.8"</code>
如果不過濾,剛好有直接透過IP來判斷是否再黑名單或後台有記錄IP操作日誌的功能:
<code>#想注入就注入 curl miaoqiyuan.cn/test.php -H "X-FORWARD-FOR:' or 'a'='a" #想XSS就XSS curl miaoqiyuan.cn/test.php -H "X-FORWARD-FOR:alert('a')"</code>
我想了個方案,可以設定nginx的時候,加入proxy_set_header X-Forward-For $remote_addr 設定。然後$_SERVER["HTTP_X_FORWARD_FOR"]取得使用者的真實IP,然後再程式裡面進行IP的限制。