52AV手機A片王|52AV.one

 找回密碼
 立即註冊
查看: 2430|回復: 0

[PHP] 如何正確的取得使用者 IP?[含5張圖]

[複製鏈接]
發表於 2015-7-3 10:46:13 | 顯示全部樓層 |閱讀模式
tid=12495& 本帖最後由 IT_man 於 2015-7-3 10:47 編輯 0 R* o) i' d; t  o
5 P$ w1 a2 n; X" x& X0 J
很多網站都會有偵測使用者 IP 的功能,不管是判斷使用者來自哪邊,或者是記錄使用者的位置。但是你知道嗎?網路上大多數的教學全部都是「錯誤」的。正確的程式寫法可以確保知道訪客的 IP,但是錯誤的寫法卻可能讓網站管理者永遠不知道犯罪者的來源。
' f' U, {6 N+ k" o4 |% I% F* m' o; b% r/ `, y4 l( c
這次我們單就偵測 IP 的議題來探討各種錯誤的寫法。! {" I* {2 }- i+ L% b- w7 R

) c0 A, n- r2 \, u% \/ M5 N
3 h# ?6 `2 `4 t3 @7 S3 L! A2 e/ C你知道網路上的教學是不安全的嗎?7 n# _' l/ z5 q9 @
我們先來看一下網路上的教學,讓我們 Google 找一下「PHP 取得 IP」,就可以看到許多人熱心的教學,我們隨意挑一個常見的教學來看看。$ o6 U* k! n- C2 f8 O
以 PHP 為例:
9 I: L! c" d5 B5 v# f1 @% C
  1. <?php
    , e0 X+ A- h- a- L2 m
  2. if(!empty($_SERVER['HTTP_CLIENT_IP'])){" _7 J4 ~, [  J. y  k$ Y" U1 I$ K
  3.    $myip = $_SERVER['HTTP_CLIENT_IP'];
    , U' X( n; J5 _  h
  4. }else if(!empty($_SERVER['HTTP_X_FORWARDED_FOR'])){
    # A) x3 v8 w2 r) g
  5.    $myip = $_SERVER['HTTP_X_FORWARDED_FOR'];/ G  V4 [* G( ^: b+ B- E- z
  6. }else{* ~# M( b6 M' I2 E+ W* r
  7.    $myip= $_SERVER['REMOTE_ADDR'];
    8 Z! {* P  @9 B' h. K. g3 k
  8. }
    " D' w2 L. l, h" t
  9. echo $myip;4 `# n7 g  Y9 o& z% Y
  10. ?>
複製代碼
) O  d; L9 w7 S/ C& l9 `

# {! z* \, |9 A8 G; j這是一個很基本的寫法、很正確的想法,如果 HTTP Header 中包含「Client-IP」,就先以他當作真實 IP。若包含「X-Forwarded-For」,則取他當作真實 IP。若兩者都沒有,則取「REMOTE_ADDR」變數作為真實 IP。因為當使用者連線時透過代理伺服器時,REMOTE_ADDR 會顯示為代理伺服器 Proxy 的 IP。部分代理伺服器會將使用者的原始真實 IP 放在 Client-IP 或 X-Forwarded-For header 中傳遞,如果在變數中呼叫則可以取得真實 IP。
, c" R5 c) ?! n# K2 [! I但是你知道嗎?網路上 80% 的教學寫法全部都是「錯誤」的。
9 m2 W8 R! M9 E( C$ s/ e+ m  b5 W  B
3 G5 W6 F6 j0 t. r" @' |  H+ X+ U* a8 n' w為什麼這樣說呢?請大家記得一件事情:「任何從客戶端取得的資料都是不可信任的!2 W3 c; i# _3 `3 X& G5 i

$ e# B. E' H  p4 \% w6 Y* G竄改 HTTP Header「X-Forwarded-For」這個變數雖然「有機會」取得使用者的真實 IP,但是由於這個值是從客戶端傳送過來的,所以「有可能」被使用者竄改。
. u0 [  e+ r2 _. X; x, c% b! }舉例來說,我寫了一個小程式,偵測這些常見的 HTTP Header 判斷 IP。並且使用 Burp Suite 這個工具來修改 HTTP Request。+ X# R$ J& w# U5 g
2014-06-12-client-ip-detection-01-detech-user-ip.png
! F8 C4 b  E2 w( C% A1 w7 f0 Z, z" l( }. r
頁面上顯示目前我目前的 IP「49.50.68.17」,並且其他的 header 是空的。但如果我今天使用 Burp Suite 之類的 Proxy 工具自行竄改封包,加上 X-Forwarded-For 或是 Client-IP header:
4 ?$ A" v1 {& ?+ N0 I9 e# w4 ?- j+ F" m! K
修改完畢之後,再到原本的顯示 IP 介面,會發現網頁錯將我竄改的 header 當作正確的資料填入。5 B  q( y8 C/ w! `$ f8 R6 \
8 N  \! I# f8 V/ A
0 {$ k& A2 l/ _  L
使用代理伺服器 Proxy 的情況使用代理伺服器的情況下,HTTP Header 會有不同的行為。例如 Elite Proxy 如何隱藏客戶端的真實 IP。以下簡單介紹幾種常見的狀況給各位參考。
/ H8 y! q! w4 {, T" |& B& s直接連線 (沒有使用 Proxy)
    % G' d! N. }- S% g+ R% P# u: ]: J
    2 c3 s+ v; q+ J% P+ ?
  • REMOTE_ADDR: 客戶端真實 IP
  • HTTP_VIA: 無
  • HTTP_X_FORWARDED_FOR: 無0 x0 W$ h6 T8 P2 h$ R
Transparent Proxy
    6 o+ v4 U6 x" O; ^

    * r- K4 _2 o9 C3 K5 }* D
  • REMOTE_ADDR: 最後一個代理伺服器 IP
  • HTTP_VIA: 代理伺服器 IP
  • HTTP_X_FORWARDED_FOR: 客戶端真實 IP,後以逗點串接多個經過的代理伺服器 IP
    7 ]: j6 M) C, k
Anonymous Proxy

    , P2 F5 \7 |9 a2 w
    / t9 K) _" J# T1 R4 L( n
  • REMOTE_ADDR: 最後一個代理伺服器 IP
  • HTTP_VIA: 代理伺服器 IP
  • HTTP_X_FORWARDED_FOR: 代理伺服器 IP,後以逗點串接多個經過的代理伺服器 IP  Z6 t& F& L. G" N$ |
High Anonymity Proxy (Elite Proxy)

    2 J. M  y4 Q, c, u/ D% u
    % B: H+ Y) v& |4 ]& ]* ~
  • REMOTE_ADDR: 代理伺服器 IP
  • HTTP_VIA: 無
  • HTTP_X_FORWARDED_FOR: 無 (或以逗點串接多個經過的代理伺服器 IP)
    * c5 }+ c3 p' T' K
實際情況在我們測試的過程中,通常我們都會讓瀏覽器自帶 X-Forwarded-For,並且自行填入 IP。常常會發現有一些網站出現如下的警告…" x. t% C0 Y3 j2 h8 F/ G
0 H+ A  ^5 O6 F$ r9 U& a
有沒有搞錯?「上次登入位置 127.0.0.1」?沒錯,這個是知名論壇套件「Discuz!」的功能,抓取 IP 的功能也是不安全的寫法。也有這樣的經驗,之前開著 X-Forwarded-For 的 header 到一些網站,竟然直接出現管理者後台!
, k0 ]) a' y& Q' w/ {7 a9 T你覺得只有一般人撰寫的程式會有這樣的問題嗎?其實大型網站也可能會有類似的問題:& y$ e$ p( c! A$ ~
  O8 T8 g8 [- s# F9 y
先不論為什麼 127.0.0.1 會在美國,這樣的寫法可能會讓管理者永遠抓不到犯罪者的真實 IP,甚至攻擊者可以竄改 header 插入特殊字元,對網站進行 SQL Injection 或者 Cross-Site Scripting 攻擊。, K, i5 F/ ^4 b

" N" t, x# e0 N! H2 A! W正確又安全的方式任何從客戶端取得的資料都是不可信任的!
, d  Q* ^0 c/ S- Q. j  h# G- C請各位開發者、管理者記住這個大原則,雖然這些 Request Header 可能含有真實 IP 的資訊,但是因為他的安全性不高,因此我們絕對不能完全信賴這個數值。
" y( q- N4 x9 g' @2 l( o, [那我們該怎麼處理呢?我的建議是記錄所有相關的 header 欄位存入資料庫,包含「REMOTE_ADDR」「X-Forwarded-For」等等,真正有犯罪事件發生時,就可以調出所有完整的 IP 資訊進行人工判斷,找出真正的 IP。當然從 header 存入的數值也可能會遭到攻擊者竄改插入特殊字元嘗試 SQL Injection,因此存入值必須先經過過濾,或者使用 Prepared Statement 進行存放。( Q& |) Q: W" \) Q* Z8 Q- x7 T0 ^
可以參考的 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)
1 n0 z  D) A4 z3 a- r$ q4 ^- J% ~「駭客思維」就是找出網站任何可能竄改的弱點,從網頁上的元素到 HTTP Header 都是嘗試的對象。因此身為防禦者一定要清楚的知道哪些數值是不能信賴的,不要再參考網路上錯誤的教學了!4 R1 q* Z7 L6 `0 k1 ]4 j' ~& V
5 V* X: _4 l9 b6 f1 m
*原文參考 CEO Allen Own 大作  http://devco.re/blog/2014/06/19/client-ip-detection/  [, ^/ o) L! y8 e% u$ @
回復

使用道具 舉報

您需要登錄後才可以回帖 登錄 | 立即註冊

本版積分規則



中文酷站排行榜

本區塊內容依據『電腦網路內容分級處理辦法』為限制級網站,限定年滿18歲以上或達當地國家法定年齡人士方可進入,且願接受本站各項條款,未滿18歲 謝絕進入瀏覽。為防範未滿18歲之未成年網友瀏覽網路上限制級內容的圖文資訊,建議您可進行網路內容分級組織ICRA分級服務的安裝與設定。 (為還給愛護 本站的網友一個純淨的論壇環境,本站設有管理員)

QQ|小黑屋|手機板| 52AV手機A片王

GMT+8, 2025-12-6 19:02 , Processed in 0.167331 second(s), 22 queries .

Powered by Discuz! X3.4

Copyright © 2001-2021, Tencent Cloud.

快速回復 返回頂部 返回列表