iT邦幫忙

0

如何抓取「無論是 POST 或 GET 打過來的主機 IP」?

假設我現在有一隻API,簡稱在A主機上
當對方從B主機POST資料給我時
我有辦法知道B的「HOST IP」嗎?
我目的是很像金流的白名單
我可以在A透過某種PHP獲取打過來的B主機 HOST IP?
(不是使用者IP)

(更新問題)

看更多先前的討論...收起先前的討論...
slime iT邦大師 1 級 ‧ 2019-07-10 15:58:40 檢舉
會有連線 IP 但不一定是"使用者的 IP "....

可能有經過 NAT 處理(例如: 宿舍網路)或透通 proxy 改寫.
火爆浪子 iT邦研究生 1 級 ‧ 2019-07-10 16:07:25 檢舉
所以金流會有白名單,這跟我這個是不一樣的嗎?
火爆浪子 iT邦研究生 1 級 ‧ 2019-07-10 16:08:00 檢舉
我目的是我在API這端可以得到對方的HOST IP
火爆浪子 iT邦研究生 1 級 ‧ 2019-07-10 16:08:54 檢舉
我不是指使用者IP,我是指對方瀏覽的網站的那個主機
你要不要先理解我們回答的東西並試一下看看可以嘛??
我敢保証你一定沒試,你試了就知道我們再說什麼了。

重頭到尾就一直跟你說直接取就好。
你一直鬼打牆的說不是要使用者ip。

說真的,真的要拿到使用者的ip還反而比較麻煩。
JWT,我講完了。
giulian iT邦新手 4 級 ‧ 2019-07-11 16:33:36 檢舉
你問題是不是這樣
應該是有一個主機A有API給外面的廠商用
外面的廠商理論上會有一台主機B對外開放給一般使用者,主機B會去call 主機A的API,但你覺得廠商有可能會除了主機B之外另外開主機C,D....
你想做到的功能是透過IP限制主機A只給主機B呼叫,其他一概不受理
基本上廠商如果要偷吃步,就像一樓說的,只要呼叫你的主機可以設定都走NAT出去除非對方主動提供,不然你由外面反向判斷可能都只能到對方的NAT IP上面
如果要限制對方的話建議用其他方式
圖片
  直播研討會
圖片
{{ item.channelVendor }} {{ item.webinarstarted }} |
{{ formatDate(item.duration) }}
直播中
4
Ray
iT邦大神 1 級 ‧ 2019-07-10 16:36:00
最佳解答

其實, 我聽不懂樓主想問甚麼?
綜整樓主的資訊如下:

當對方POST資料給我
我不是指使用者IP,我是指對方瀏覽的網站的那個主機

假設上面兩句中:
對方=A
我的主機=B
對方瀏覽的網站那個主機=C

那麼第一句的情境是:
A POST 資料給 B

但是第二句的情境是:
A 瀏覽網站 C

請問:
如果 A 正在瀏覽 C 網站,
他又如何能同時 POST 資料給 B?

兩個情境描述互相矛盾, 後面的問題就很難有答案...

看更多先前的回應...收起先前的回應...
火爆浪子 iT邦研究生 1 級 ‧ 2019-07-10 16:38:54 檢舉

我要知道C的HOST IP,我在API那台主機做事就行

Ray iT邦大神 1 級 ‧ 2019-07-10 16:41:07 檢舉

你的回答還是不夠清楚;
請試著回答以下的問題:

  1. A 用瀏覽器直接連到你的 B 主機下 POST
  2. A 連到 C 主機, 由 C 主機的後台下 POST 給 B

你要的狀況是上面的 1 或是 2?

火爆浪子 iT邦研究生 1 級 ‧ 2019-07-10 17:06:26 檢舉

對方A
程式主機B
API主機C

A瀏覽B時,B會有個程式打API到C
我C想要知道B的主機HOST IP

Ray iT邦大神 1 級 ‧ 2019-07-10 17:15:23 檢舉

這樣終於清楚了...

答案是:
雖然 A 的瀏覽器在連上 B 的時候, 會把他自己的 IP 傳遞給 B....但是....

B 在呼叫 C 的 API 時, 只會將 B 自己的 IP 傳遞給 C, 把 A 的 IP 丟棄...

如果你想取得 A 的 IP, 必須在 API 裡面增加一個欄位來傳遞 A 的 IP, 同時請 B 修改程式, 事先儲存每一個由 A 傳來的 IP, 而且在呼叫 C 的時候, 把 A 的 IP 放進 API 的欄位內傳給 C.

如果中間的 B 不幫忙處理, C 無法拿到 A 的 IP.

順帶一提:
金流鎖白名單都是鎖 B 的 IP, 沒人會去鎖 A 的 IP...

原來老大也會教國文
太棒了 XD

火爆浪子 iT邦研究生 1 級 ‧ 2019-07-10 17:28:48 檢舉

我不要A的IP
我要B的主機HOST IP
當B打API到我的C時
我C能抓到B的HOST IP這樣

火爆浪子 iT邦研究生 1 級 ‧ 2019-07-10 17:30:01 檢舉

(我沒有要A的任何東西)

火爆浪子 iT邦研究生 1 級 ‧ 2019-07-10 17:33:42 檢舉

B 在呼叫 C 的 API 時, 只會將 B 自己的 IP 傳遞給 C, 把 A 的 IP 丟棄...

對,我就是要B的IP

如果你想取得 A 的 IP, 必須在 API 裡面增加一個欄位來傳遞 A 的 IP, 同時請 B 修改程式, 事先儲存每一個由 A 傳來的 IP, 而且在呼叫 C 的時候, 把 A 的 IP 放進 API 的欄位內傳給 C.

如果中間的 B 不幫忙處理, C 無法拿到 A 的 IP.

不需要A的任何東西

Ray iT邦大神 1 級 ‧ 2019-07-10 21:04:02 檢舉

(抱歉前面誤會您的回答, 下面重新來過)

那就要看你的 C 是用甚麼軟體寫的?

如前面大家回答的, C 的 Web Server 軟體, 會將 Remote Address 這個 HTTP Header 傳遞給你自己寫的軟體, 但是要如何取出這個 IP? 得先看你是用哪一種軟體? 才知道相對應的語法是甚麼?

追蹤到此, 已經很明確的答案有:

  1. 你想要的是 B 的 IP
  2. 若 B 是透過 HTTP 協議去連 C 的 API, 他會將自己的 IP 放在 HTTP Header 裡面, 傳送給 C, 這是 HTTP 規定必須給的, 所以 B 一定會把 IP 傳給 C.
  3. C 的 Web Server 一定會收到 B 的 IP, 但是要怎麼取出這個 IP? 要看你是用哪一種軟體寫程式? 每一種軟體取 IP 的寫法都不太相同...
火爆浪子 iT邦研究生 1 級 ‧ 2019-07-10 21:05:40 檢舉

我是用 PHP

Ray iT邦大神 1 級 ‧ 2019-07-10 21:08:15 檢舉

那就很容易辦, 這裡有很多解答可以參考:
Google: php get remote ip

唉,讓大神來教你國文解釋。嘖嘖

我只告訴你一個重點就行了。
所謂取得來源點ip。就是看哪台主機來連你的主機。

今天如果是a連過來的,你c就是取到a主機。
如果是b主機連過來的,你c取到的就是b主機的ip。

a連到b透過b來連線到c。讓對c來說就是b來連接。所以取到b的ip。

這樣有很難理解嘛?
來源ip來源ip。

如果你是要a連過來b後,用b來連接c。但想從c取到a的ip,這才是最難的。
因為你能取到的只有b傳過來的資料。除非b有幫你傳(這又得討論到proxy或是cdn的事了)

也就是說,看誰來對你的主機連線。你就是取他的ip。
這樣不難理解吧?

WQ iT邦新手 2 級 ‧ 2019-07-12 13:44:36 檢舉
6

這個我就要開罵了。
就算不懂也得學會用google吧。

這樣子的東西,google查一大堆寫法。
為何還要來這裏問。

這次不給你程式碼,給你關鍵字自已去研究 「php 取得來源ip」

froce iT邦大師 1 級 ‧ 2019-07-10 18:45:33 檢舉

連HTTP header都不會取也太扯...

1
dragonH
iT邦超人 5 級 ‧ 2019-07-10 16:04:31

這問題害我都不好意思用回答了

那就來討論看看其他的問題

1 .

對方不需要帶HOST IP給我

對方沒得選

他在發送 http request 時

就會帶相關的 header 給你

我的理解

當然

這東西也很容易偽造

所以你得到或許不是你要的


你真要做類似白名單的驗證

與其去驗證 ip

還不如用 jwt 之類的 token 還更有用

看更多先前的回應...收起先前的回應...
火爆浪子 iT邦研究生 1 級 ‧ 2019-07-10 16:06:36 檢舉

疑?連這個也可以偽造?

火爆浪子 iT邦研究生 1 級 ‧ 2019-07-10 16:09:10 檢舉

我不是指使用者IP,我是指對方瀏覽的網站的那個主機

火爆浪子 iT邦研究生 1 級 ‧ 2019-07-10 16:12:05 檢舉

主要是白名單的功用,偽造那他就是沒辦法通過我這裡,偽造機率應該很低吧,就很像是金流的白名單

dragonH iT邦超人 5 級 ‧ 2019-07-10 16:18:36 檢舉

金流驗證很多都改用 token 或者 key 來驗證了吧

其實取來源ip判斷,的確是只防君子不防小人。
一般我還是會取ip先做優先判斷。確定能過才做檢查token。

而且認真來說,REMOTE_ADDR是無法偽照的。(雖然,還是可以透過其它方式來處理)

火爆浪子 iT邦研究生 1 級 ‧ 2019-07-10 16:37:43 檢舉

dragonH:我看TAPPAY還是會有一個白名單機制,登記你服務的那台HOST

dragonH iT邦超人 5 級 ‧ 2019-07-10 16:40:35 檢舉

一定還是會有用 ip 做驗證的呀

銀行應該清一色都是

讓我選的話

我會用 token

可以省掉一些 純判斷 ip 可能會有的問題

tappay 看起來也是有用 api key 之類的東西

火爆浪子 iT邦研究生 1 級 ‧ 2019-07-10 17:29:35 檢舉

我這邊的程式是會丟給業主的
我目的是為了防止複製可以使用

火爆浪子 iT邦研究生 1 級 ‧ 2019-07-10 17:40:41 檢舉

他後台有一個白名單的功能,輸入HOSTIP用

不明
【**此則訊息已被站方移除**】
2
永往直前
iT邦新手 4 級 ‧ 2019-07-11 06:13:56

【對方主機】連線到【你的主機】來詢求 API,

這個運作的狀態下,
【對方主機】跟【你的主機】的關係,
就是【使用者】與【伺服器】的關係,

所以你在【你的主機】直接執行取得【使用者 IP】 的方法,
就會直接拿到【對方主機 IP】了。

<?

print($_SERVER['HTTP_CLIENT_IP']. '<br>');
print($_SERVER['HTTP_X_FORWARDED_FOR']. '<br>')
print($_SERVER['REMOTE_ADDR']. '<br>')

//主機之間若是直連,請取用
print($_SERVER['REMOTE_ADDR']. '<br>')

?>
火爆浪子 iT邦研究生 1 級 ‧ 2019-07-12 12:23:39 檢舉

好的我來試試看

2
wwx
iT邦好手 1 級 ‧ 2019-07-11 09:43:11

我只是想提醒一下,
遠端IP(REMOTE_ADDR)並沒有包含在HTTP Header裏面,

HTTP Header可能有Client-IP或X-Forwarded-For,
這是代理伺服器用來提供代理伺服器所獲得的用戶端遠端IP,
相對是比較容易被竄改或偽造的,而且這兩個標頭內容可能是多個IP,
會視途中經過的代理伺服器處理時而延伸增加描述相關節點的各個遠端IP內容,

REMOTE_ADDR這個資訊是TCP連線的TCP Header內容,
只是在ASP/PHP裡面處理的方式跟撈HTTP Header的方式一樣而已...
(雖然同款但是不同師父)

火爆浪子 iT邦研究生 1 級 ‧ 2019-07-12 12:22:25 檢舉

感謝

我要發表回答

立即登入回答