如何取得使用者 IP 的方法與資安探索

https://devco.re/blog/2014/06/19/client-ip-detection/

本文與留言區的討論


重點摘錄:

一、使用代理伺服器的情況下,HTTP Header 會有不同的行為。例如 Elite Proxy 如何隱藏客戶端的真實 IP。以下簡單介紹幾種常見的狀況給各位參考。

直接連線 (沒有使用 Proxy)
REMOTE_ADDR: 客戶端真實 IP
HTTP_VIA: 無
HTTP_X_FORWARDED_FOR: 無

Transparent Proxy
REMOTE_ADDR: 最後一個代理伺服器 IP
HTTP_VIA: 代理伺服器 IP
HTTP_X_FORWARDED_FOR: 客戶端真實 IP,後以逗點串接多個經過的代理伺服器 IP

Anonymous Proxy
REMOTE_ADDR: 最後一個代理伺服器 IP
HTTP_VIA: 代理伺服器 IP
HTTP_X_FORWARDED_FOR: 代理伺服器 IP,後以逗點串接多個經過的代理伺服器 IP

High Anonymity Proxy (Elite Proxy)
REMOTE_ADDR: 代理伺服器 IP
HTTP_VIA: 無
HTTP_X_FORWARDED_FOR: 無 (或以逗點串接多個經過的代理伺服器 IP)


二、攻擊者可以竄改 header 插入特殊字元,對網站進行 SQL Injection 或者 Cross-Site Scripting 攻擊。


三、從資安的角度,應留存下所有可能紀錄到真實 IP 的資料,記錄下所有相關的 header 欄位,包含「REMOTE_ADDR」「X-Forwarded-For」等等,真正有犯罪事件發生時,就可以調出所有完整的 IP 資訊進行人工判斷,從蛛絲馬跡中或許有機會找出真正的 IP。當然從 header 存入的數值也可能會遭到攻擊者竄改插入特殊字元嘗試 SQL Injection,因此存入值必須先經過過濾,或者使用 Prepared Statement 進行存放。

可以參考的 HTTP Header(依照可能存放真實 IP 的順序)

HTTP_CLIENT_IP
HTTP_X_FORWARDED_FOR
HTTP_X_FORWARDED
HTTP_X_CLUSTER_CLIENT_IP
HTTP_FORWARDED_FOR
HTTP_FORWARDED
REMOTE_ADDR (真實 IP 或是 Proxy IP)
HTTP_VIA (參考經過的 Proxy)

「駭客思維」就是找出網站任何可能竄改的弱點,從網頁上的元素到 HTTP Header 都是嘗試的對象。因此身為防禦者一定要清楚的知道哪些數值是不能信賴的。


四、REMOTE_ADDR 只能透過 Proxy、VPN 等方法來改變,沒辦法藉由竄改 Header 來假造。

五、用 Onion Routing 連線的 IP 有辦法被查出嗎? 沒有辦法,只能夠知道「Exit Node」的 IP。

六、一般來說不會透過 Onion Routing 來做 DDoS 攻擊。典型的 的 DDoS 攻擊也無法透過 Onion Routing。

七、Web Server 能夠取得的資訊就是那些欄位,包含 REMOTE_ADDR 以及其他 HTTP Header,因此能夠獲得的資訊有限。直接 TCP 連線的 IP 位置就是 REMOTE_ADDR。

程式語言編年史

程式語言編年史原文 下面這張圖片描繪了整個程式語言的歷史。包括各種程式語言的發明人、程式語言的特點和適用領域、被什麼網站或公司使用等 (檢視 完整高清圖 )。 之所以會有那麼多不同的程式語言是因為設計程式語言的初衷不同、對語言學習曲線的追求不同、不同程式之間的執行成本差異...