in header_common.htm --> -->

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

 找回密碼
 立即註冊
快捷導航

     
查看: 5055|回復: 0
打印 上一主題 下一主題

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

[複製鏈接]
跳轉到指定樓層
樓主
發表於 2015-7-3 10:46:13 | 只看該作者 |只看大圖 回帖獎勵 |倒序瀏覽 |閱讀模式

本帖最後由 IT_man 於 2015-7-3 10:47 編輯
  C4 n3 r3 [) i* C
" i. N7 k) ]# u1 {! f1 X4 S很多網站都會有偵測使用者 IP 的功能,不管是判斷使用者來自哪邊,或者是記錄使用者的位置。但是你知道嗎?網路上大多數的教學全部都是「錯誤」的。正確的程式寫法可以確保知道訪客的 IP,但是錯誤的寫法卻可能讓網站管理者永遠不知道犯罪者的來源。0 X- ~! ]  [$ a! E
+ A8 ^/ B+ f) a  O) u8 d
這次我們單就偵測 IP 的議題來探討各種錯誤的寫法。. W. z5 C! {+ E* C' O  d
  y/ U/ o5 N* O6 O3 K

: b) }6 \1 W* ~6 N7 I你知道網路上的教學是不安全的嗎?; c) R6 O$ x% H: [
我們先來看一下網路上的教學,讓我們 Google 找一下「PHP 取得 IP」,就可以看到許多人熱心的教學,我們隨意挑一個常見的教學來看看。
2 B6 I8 l) @8 h! k6 [以 PHP 為例:
# m) ?) Y; G/ Q& b
  1. <?php
    % ~3 }: H7 F! g4 T$ f, R5 }
  2. if(!empty($_SERVER['HTTP_CLIENT_IP'])){
    9 l( m1 k3 [' R: c8 |" x$ f$ k9 \. ~
  3.    $myip = $_SERVER['HTTP_CLIENT_IP'];
    . ?" e2 h' ?- m2 b( Q. V  z
  4. }else if(!empty($_SERVER['HTTP_X_FORWARDED_FOR'])){8 q9 a4 m$ u6 A
  5.    $myip = $_SERVER['HTTP_X_FORWARDED_FOR'];2 ?# X( W6 H4 v" H: N
  6. }else{
    " Q5 a) U. M  O  D: |( ~2 J
  7.    $myip= $_SERVER['REMOTE_ADDR'];
    % C1 g& d4 m7 o
  8. }
    % [# u- T2 X5 O9 a
  9. echo $myip;
    6 m( m7 s$ M/ h& v
  10. ?>
複製代碼

& [; D, Q9 F, n% l: e7 j; ~2 b3 p( I0 B& L6 Z9 O1 |: r; v
這是一個很基本的寫法、很正確的想法,如果 HTTP Header 中包含「Client-IP」,就先以他當作真實 IP。若包含「X-Forwarded-For」,則取他當作真實 IP。若兩者都沒有,則取「REMOTE_ADDR」變數作為真實 IP。因為當使用者連線時透過代理伺服器時,REMOTE_ADDR 會顯示為代理伺服器 Proxy 的 IP。部分代理伺服器會將使用者的原始真實 IP 放在 Client-IP 或 X-Forwarded-For header 中傳遞,如果在變數中呼叫則可以取得真實 IP。
) V9 y$ t* m4 a8 E9 }* ?但是你知道嗎?網路上 80% 的教學寫法全部都是「錯誤」的。2 C! v. v0 f! J' K- v, a

3 j# L( D& u) p/ X8 F1 J. W, b為什麼這樣說呢?請大家記得一件事情:「任何從客戶端取得的資料都是不可信任的!" Y, N, m$ G+ k( `: {

% Y4 L$ {# U$ M) s+ k$ t竄改 HTTP Header「X-Forwarded-For」這個變數雖然「有機會」取得使用者的真實 IP,但是由於這個值是從客戶端傳送過來的,所以「有可能」被使用者竄改。% M+ d! S7 y) |; O9 Y- b7 H1 s
舉例來說,我寫了一個小程式,偵測這些常見的 HTTP Header 判斷 IP。並且使用 Burp Suite 這個工具來修改 HTTP Request。
3 i) x. _5 g4 |( m5 P- W1 `
! d4 I3 b4 t. S' K9 y1 B% Z; m
& v; X  b: N* v8 b: F( {頁面上顯示目前我目前的 IP「49.50.68.17」,並且其他的 header 是空的。但如果我今天使用 Burp Suite 之類的 Proxy 工具自行竄改封包,加上 X-Forwarded-For 或是 Client-IP header:
4 r$ z# [3 m4 a+ e' t5 ~9 {) \. }3 W/ K0 A3 N
修改完畢之後,再到原本的顯示 IP 介面,會發現網頁錯將我竄改的 header 當作正確的資料填入。: M& @$ D" [1 [3 ^2 R$ _
% x3 J5 {2 t& r. c, O

4 l+ G2 I* b/ B. k使用代理伺服器 Proxy 的情況使用代理伺服器的情況下,HTTP Header 會有不同的行為。例如 Elite Proxy 如何隱藏客戶端的真實 IP。以下簡單介紹幾種常見的狀況給各位參考。( L- K, r- n  }/ g  J& ?
直接連線 (沒有使用 Proxy)

    ' g( C2 t0 C$ ?1 O% U
    & x  [& Z/ f' ], X0 Q
  • REMOTE_ADDR: 客戶端真實 IP
  • HTTP_VIA: 無
  • HTTP_X_FORWARDED_FOR: 無: L3 a- z- \5 G5 Q/ a
Transparent Proxy
      Y1 D: j6 I, W& Y4 c8 \* C% `
    7 B( R* \* U" O9 v% R. f' `
  • REMOTE_ADDR: 最後一個代理伺服器 IP
  • HTTP_VIA: 代理伺服器 IP
  • HTTP_X_FORWARDED_FOR: 客戶端真實 IP,後以逗點串接多個經過的代理伺服器 IP. q* a& z# i8 m( B: x
Anonymous Proxy

    : E1 S$ T  e% V9 E) ~( f& P; M! @7 C! C1 I- [3 c! L  W
  • REMOTE_ADDR: 最後一個代理伺服器 IP
  • HTTP_VIA: 代理伺服器 IP
  • HTTP_X_FORWARDED_FOR: 代理伺服器 IP,後以逗點串接多個經過的代理伺服器 IP4 J# N) F9 h  r4 Z8 _- x
High Anonymity Proxy (Elite Proxy)
    ( e( z9 i6 s' ]) j: L
    - G  Y: W; [2 B
  • REMOTE_ADDR: 代理伺服器 IP
  • HTTP_VIA: 無
  • HTTP_X_FORWARDED_FOR: 無 (或以逗點串接多個經過的代理伺服器 IP)
    " `5 R- N: z! u
實際情況在我們測試的過程中,通常我們都會讓瀏覽器自帶 X-Forwarded-For,並且自行填入 IP。常常會發現有一些網站出現如下的警告…
; |, ?# A9 m) U' d+ a/ g! L% g/ Y  Q1 f
有沒有搞錯?「上次登入位置 127.0.0.1」?沒錯,這個是知名論壇套件「Discuz!」的功能,抓取 IP 的功能也是不安全的寫法。也有這樣的經驗,之前開著 X-Forwarded-For 的 header 到一些網站,竟然直接出現管理者後台!& J& R3 g: r9 a8 Y% s. k4 p$ m2 [
你覺得只有一般人撰寫的程式會有這樣的問題嗎?其實大型網站也可能會有類似的問題:, g: \& S4 V, U! c
+ ~3 Y( g* p& E# f
先不論為什麼 127.0.0.1 會在美國,這樣的寫法可能會讓管理者永遠抓不到犯罪者的真實 IP,甚至攻擊者可以竄改 header 插入特殊字元,對網站進行 SQL Injection 或者 Cross-Site Scripting 攻擊。
3 x  Y# W- g6 I" D; \. n# d  }  P, L7 p% x: E: k! C
正確又安全的方式任何從客戶端取得的資料都是不可信任的!+ y! S; _! X( b  A6 S7 \
請各位開發者、管理者記住這個大原則,雖然這些 Request Header 可能含有真實 IP 的資訊,但是因為他的安全性不高,因此我們絕對不能完全信賴這個數值。
, G- k0 a; Q8 ^" k# j那我們該怎麼處理呢?我的建議是記錄所有相關的 header 欄位存入資料庫,包含「REMOTE_ADDR」「X-Forwarded-For」等等,真正有犯罪事件發生時,就可以調出所有完整的 IP 資訊進行人工判斷,找出真正的 IP。當然從 header 存入的數值也可能會遭到攻擊者竄改插入特殊字元嘗試 SQL Injection,因此存入值必須先經過過濾,或者使用 Prepared Statement 進行存放。# Y8 |/ V' G  j/ S. w
可以參考的 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)4 [5 Y8 W+ f( {& n) V. V
「駭客思維」就是找出網站任何可能竄改的弱點,從網頁上的元素到 HTTP Header 都是嘗試的對象。因此身為防禦者一定要清楚的知道哪些數值是不能信賴的,不要再參考網路上錯誤的教學了!, t; T+ N9 P8 g

" G+ z' x1 E3 {, O0 t, n+ X- _$ q*原文參考 CEO Allen Own 大作  http://devco.re/blog/2014/06/19/client-ip-detection/
* P4 j% _1 l% a* n( F" T
-->
您需要登錄後才可以回帖 登錄 | 立即註冊

本版積分規則


-->

聚BT福利

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

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

GMT+8, 2024-12-29 16:34 , Processed in 0.061426 second(s), 20 queries .

連絡站長.廣告招商

[email protected] | QQ:2405733034     since 2015-01

裸聊妹 快速回復 返回頂部 返回列表