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

 找回密碼
 立即註冊
快捷導航
  • 我愛av論壇BBS
  • 手機A片
  • 自拍偷拍外流區
  • 貼圖區
  • 52av裸聊室
  • 中文-中國主播
Yahoo!奇摩搜尋
熱搜: av4u論壇
Google搜尋
熱搜: av4u論壇
     
查看: 6315|回復: 0

[PHP] 如何正確的取得使用者 IP?

[複製鏈接]
發表於 2015-7-3 10:46:13 | 顯示全部樓層 |閱讀模式
本帖最後由 IT_man 於 2015-7-3 10:47 編輯 - J" ~( h  ~5 X( L* h( D
4 o" Q9 c4 h6 @  B
很多網站都會有偵測使用者 IP 的功能,不管是判斷使用者來自哪邊,或者是記錄使用者的位置。但是你知道嗎?網路上大多數的教學全部都是「錯誤」的。正確的程式寫法可以確保知道訪客的 IP,但是錯誤的寫法卻可能讓網站管理者永遠不知道犯罪者的來源。
( Z3 d2 c' E) x4 L6 w1 @# E
4 k, b  E* q! i) C) e- S這次我們單就偵測 IP 的議題來探討各種錯誤的寫法。4 W( ]/ u" s7 D) l1 X$ r( G
/ N$ R: w9 N* N0 T6 o8 Q
$ ^, |3 N" ]7 O# K! B* J
你知道網路上的教學是不安全的嗎?
3 r& y2 Q) O: @5 U我們先來看一下網路上的教學,讓我們 Google 找一下「PHP 取得 IP」,就可以看到許多人熱心的教學,我們隨意挑一個常見的教學來看看。
2 t0 s  y( ]2 x% ^以 PHP 為例:
: T' d( ^5 C: H9 K" \9 _' h& V
  1. <?php
    ' ~( C1 b$ J! i& U$ V& Q) V
  2. if(!empty($_SERVER['HTTP_CLIENT_IP'])){1 z. c$ H/ V. M0 j; b& I
  3.    $myip = $_SERVER['HTTP_CLIENT_IP'];- a; d$ {' G: Q- _+ s9 _
  4. }else if(!empty($_SERVER['HTTP_X_FORWARDED_FOR'])){7 m5 m; Q- t) G: a6 H, P8 z
  5.    $myip = $_SERVER['HTTP_X_FORWARDED_FOR'];: z% ~: n; m3 z6 J) j3 `% F7 q
  6. }else{
    ! a- T) X' u2 b' C& f+ c% K6 ^1 A
  7.    $myip= $_SERVER['REMOTE_ADDR'];9 k. ^$ [1 f* Y) ^& M8 o- l
  8. }/ C" y' {/ y! ~9 a4 d, A( g
  9. echo $myip;+ A0 S9 x; W3 H: R4 m" l; i* M
  10. ?>
複製代碼
: P$ ?7 {! c5 v# s, I: ^3 u
6 ?0 s& w$ W, b( g# @% F# L
這是一個很基本的寫法、很正確的想法,如果 HTTP Header 中包含「Client-IP」,就先以他當作真實 IP。若包含「X-Forwarded-For」,則取他當作真實 IP。若兩者都沒有,則取「REMOTE_ADDR」變數作為真實 IP。因為當使用者連線時透過代理伺服器時,REMOTE_ADDR 會顯示為代理伺服器 Proxy 的 IP。部分代理伺服器會將使用者的原始真實 IP 放在 Client-IP 或 X-Forwarded-For header 中傳遞,如果在變數中呼叫則可以取得真實 IP。
2 _9 C% c- m; r, q1 n$ W" |6 g/ s- s但是你知道嗎?網路上 80% 的教學寫法全部都是「錯誤」的。
" g, I4 r& d$ i! e; @  Q
( o1 T. R. k9 T$ C8 O7 {為什麼這樣說呢?請大家記得一件事情:「任何從客戶端取得的資料都是不可信任的!, d6 Q% {8 V# _# a( ~, g' m% P
+ l8 J- {* h% A. G
竄改 HTTP Header「X-Forwarded-For」這個變數雖然「有機會」取得使用者的真實 IP,但是由於這個值是從客戶端傳送過來的,所以「有可能」被使用者竄改。
$ C& y* x' \5 ^7 }3 `舉例來說,我寫了一個小程式,偵測這些常見的 HTTP Header 判斷 IP。並且使用 Burp Suite 這個工具來修改 HTTP Request。
* @# u+ }9 ^' S3 V+ L6 r 2014-06-12-client-ip-detection-01-detech-user-ip.png / U4 y1 I/ P, U$ ~4 M. S! A

, s# j* [: h3 B9 e頁面上顯示目前我目前的 IP「49.50.68.17」,並且其他的 header 是空的。但如果我今天使用 Burp Suite 之類的 Proxy 工具自行竄改封包,加上 X-Forwarded-For 或是 Client-IP header:5 m$ T$ t5 ]8 A! v4 P& b6 [5 J
2 d) [* X3 p( }# ]( l8 p
修改完畢之後,再到原本的顯示 IP 介面,會發現網頁錯將我竄改的 header 當作正確的資料填入。- X; F+ K9 r9 a! y$ }8 G4 g
( d. {. \  u# J- w% q3 v
8 k" a8 d7 Z. u+ L: `8 Z3 v
使用代理伺服器 Proxy 的情況使用代理伺服器的情況下,HTTP Header 會有不同的行為。例如 Elite Proxy 如何隱藏客戶端的真實 IP。以下簡單介紹幾種常見的狀況給各位參考。
+ m  h. a& J0 x3 i$ V直接連線 (沒有使用 Proxy)
    ( j3 D3 u7 d$ ?, O2 X5 z2 n

    * w$ k! H3 i2 g' D
  • REMOTE_ADDR: 客戶端真實 IP
  • HTTP_VIA: 無
  • HTTP_X_FORWARDED_FOR: 無+ Z  ]& @" v) U1 I3 v
Transparent Proxy

    0 H% {6 Y  j3 d. o* v$ d
    / W# o" `) A4 W
  • REMOTE_ADDR: 最後一個代理伺服器 IP
  • HTTP_VIA: 代理伺服器 IP
  • HTTP_X_FORWARDED_FOR: 客戶端真實 IP,後以逗點串接多個經過的代理伺服器 IP( b, P6 R" `+ q9 r$ ~  `) p- N: t
Anonymous Proxy
    9 J: ]. I0 L: Z+ p7 G& K  D
    4 I. k) p( ~" m4 p8 C
  • REMOTE_ADDR: 最後一個代理伺服器 IP
  • HTTP_VIA: 代理伺服器 IP
  • HTTP_X_FORWARDED_FOR: 代理伺服器 IP,後以逗點串接多個經過的代理伺服器 IP
    3 @6 x' Q7 O8 M  `
High Anonymity Proxy (Elite Proxy)
    * ]5 u( F4 V: a$ c" q8 _

    4 x5 V! a6 b, D. {
  • REMOTE_ADDR: 代理伺服器 IP
  • HTTP_VIA: 無
  • HTTP_X_FORWARDED_FOR: 無 (或以逗點串接多個經過的代理伺服器 IP)
    $ X" x: N/ {$ y4 S5 p
實際情況在我們測試的過程中,通常我們都會讓瀏覽器自帶 X-Forwarded-For,並且自行填入 IP。常常會發現有一些網站出現如下的警告…
" \) ?1 f, T" _. h, A( b
* g1 Y- Z) X, K; C有沒有搞錯?「上次登入位置 127.0.0.1」?沒錯,這個是知名論壇套件「Discuz!」的功能,抓取 IP 的功能也是不安全的寫法。也有這樣的經驗,之前開著 X-Forwarded-For 的 header 到一些網站,竟然直接出現管理者後台!; O6 O1 K1 _5 }2 o" s0 b
你覺得只有一般人撰寫的程式會有這樣的問題嗎?其實大型網站也可能會有類似的問題:
- v) x3 r4 b& w- G6 T: r' e8 D2 a# V
先不論為什麼 127.0.0.1 會在美國,這樣的寫法可能會讓管理者永遠抓不到犯罪者的真實 IP,甚至攻擊者可以竄改 header 插入特殊字元,對網站進行 SQL Injection 或者 Cross-Site Scripting 攻擊。- @$ m; H/ a$ b

+ r  b* y6 Z3 t7 ]3 a& a正確又安全的方式任何從客戶端取得的資料都是不可信任的!/ e+ F' p/ c6 y
請各位開發者、管理者記住這個大原則,雖然這些 Request Header 可能含有真實 IP 的資訊,但是因為他的安全性不高,因此我們絕對不能完全信賴這個數值。# r3 y, G- h; w. Q# e' m
那我們該怎麼處理呢?我的建議是記錄所有相關的 header 欄位存入資料庫,包含「REMOTE_ADDR」「X-Forwarded-For」等等,真正有犯罪事件發生時,就可以調出所有完整的 IP 資訊進行人工判斷,找出真正的 IP。當然從 header 存入的數值也可能會遭到攻擊者竄改插入特殊字元嘗試 SQL Injection,因此存入值必須先經過過濾,或者使用 Prepared Statement 進行存放。
7 Y1 [) J7 I% S6 w% C$ S# Z可以參考的 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)6 v1 \' ?& N5 q* G
「駭客思維」就是找出網站任何可能竄改的弱點,從網頁上的元素到 HTTP Header 都是嘗試的對象。因此身為防禦者一定要清楚的知道哪些數值是不能信賴的,不要再參考網路上錯誤的教學了!+ t$ [/ Q  O" G7 n# }6 Z

7 a& y) u! U( w9 O' [& P( x& b. ~*原文參考 CEO Allen Own 大作  http://devco.re/blog/2014/06/19/client-ip-detection/
( x: a- W1 i8 F2 Q
回復

使用道具 舉報

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

本版積分規則

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

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

GMT+8, 2026-5-2 05:18 , Processed in 0.007892 second(s), 20 queries .

Powered by Discuz! X3.4

© 2001-2023 Discuz! Team.

連絡站長.廣告招商

[email protected] | Telegram:@asa00061     since 2015-01

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