[PHP] 不使用 System Call 系統呼叫類型方法取得伺服器對外 Public IP Address

本篇文章更新時間:2022/06/01
如有資訊過時或語誤之處,歡迎使用 Contact 功能通知。
一介資男的 LINE 社群開站囉!歡迎入群聊聊~
如果本站內容對你有幫助,歡迎使用 BFX Pay 加密貨幣新台幣 贊助支持。


權限過於開放的 PHP 執行環境雖然很方便好用,但要面對的是隨時都有可能被攻破,然後延伸打穿的資安問題。

如果要取得系統其他軟體運作上的資訊,網路上大多會直接跟你說使用 system()exec()shell_exec() 這些方法來直接呼叫該軟體,取得回傳資訊來分析。

如果要避開這些方法呼叫來取的伺服器對外 IP 目前查到最快最方便的作法就是: 開 Socket 來呼叫 socket_getsockname 這個方法取得本機請求的地址。

看到這做法的時候,真的覺得應該沒有更好的解了!(如果有歡迎跟我說啊~)

實作方式也夠簡單:

function get_localipv4() {
    $sock = socket_create(AF_INET, SOCK_DGRAM, SOL_UDP);
    socket_connect($sock, "8.8.8.8", 53);
    socket_getsockname($sock, $name);
    $localAddr = $name;
    socket_close($sock);
    return $localAddr;
}

function get_localipv6() {
    $sock = socket_create(AF_INET6, SOCK_DGRAM, SOL_UDP);
    //cloudflare ipv6 dns
    socket_connect($sock, "2606:4700:4700::1111", 53);
    socket_getsockname($sock, $name);
    $localAddr = $name;
    socket_close($sock);
    return $localAddr;
}

對幾乎算是公開後不會倒的 DNS 查詢位置(Google 的 8.8.8.8 與 Cloudflare 的 IPv6 )建立連結來反查自己主機的 IP 地址。

其他方法當然也通,原理也一樣,對某伺服器發起請求,由該伺服器回應這個請求位置是多少,

像是 Cloudflare 有這個特殊請求頁面 cdn-cgi/trace,直接去抓資料來分析也是一招。同樣的 Amazon 也有一個 checkip 的頁面會顯示請求的 IP。

上段提到走 HTTP 協議類型的,除了速度慢問題之外,還有一個關鍵就是沒辦法決定要取得的 IP 類型,當前發出去的請求如果使用 IPv4 你就只能拿到 IPv4 的地址,又或是對方伺服器的回應是有偏好的,那也沒能可以確定拿到本機伺服器對外的兩組。

會有這個需求也是因為前篇實作本機的瀏覽日誌防火牆規則,必須要先把本機 IP 都給排除,避免把自己的請求給封鎖了。


Share:

作者: Chun

資訊愛好人士。主張「人人都該為了偷懶而進步」。期許自己成為斜槓到變進度條 100% 的年輕人。[///////////____34%_________]

發佈留言

發佈留言必須填寫的電子郵件地址不會公開。 必填欄位標示為 *

文章
Filter

Filter Search Results