本篇文章更新時間: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 都給排除,避免把自己的請求給封鎖了。