PHP獲取IP位址的方法,防止偽造IP位址注入攻擊

2021-09-19 21:45:37 字數 2496 閱讀 6245

原文:

php獲取ip位址的方法,防止偽造ip位址注入攻擊

php獲取ip位址的方法

/*

* * 獲取客戶端ip位址

* "x-forwarded-for" 是**伺服器通過 http headers 提供的客戶端ip。**伺服器可以偽造任何ip。

* 要防止偽造,不要讀這個ip即可(同時告訴使用者不要用http **)。

* @param integer $type 返回型別 0 返回ip位址 1 返回ipv4位址數字

* @param boolean $adv 是否進行高階模式獲取(有可能被偽裝)

//ip位址合法驗證, 防止通過ip注入攻擊

$long = sprintf("%u", ip2long($ip

));

$ip = $long ? array($ip, $long) : array('0.0.0.0', 0);

return

$ip[$type];}

/*** 獲得使用者的真實ip位址

* $_server和getenv的區別,getenv不支援iis的isapi方式執行的php

}//使用正則驗證ip位址的有效性,防止偽造ip位址進行sql注入攻擊

preg_match("/[\d\.]/", $realip, $onlineip

);

$realip = !empty($onlineip[0]) ? $onlineip[0] : '0.0.0.0';

return

$realip

;}

unkonwn, unknown, 211.100.22.30

172.16.20.110, 202.116.64.196, 203.81.21.61

10.194.75.83, 10.194.73.11, 10.194.71.11, unknown

192.168.120.57, unknown, unknown, 211.10.10.195

unknown, 210.75.1.181

155.161.59.47, unknown

ip偽造有幾種途徑,一種是通過是修改ip資料報,有興趣的可以去看看ip資料報的結構,還有一種就是利用修改http頭資訊來實現ip偽造。涉及到「客戶端」ip的通常使用3個環境變數:$_server['http_client_ip']和$_server['x_forwarded_for']還有$_server['remote_addr']實際上,這3個環境變數都有侷限性。前兩個是可以隨意偽造。只要在傳送的http頭里設定相應值就可以,任意字元都可以,而第3個環境變數,如果使用者使用了匿名**,那這個變數顯示的就是**ip。

一般獲取ip後更新到資料庫**如:$sql="update t_users set login_ip='".get_client_ip()."' where ...",而如果接收到的ip位址是:***.***.***.***';delete from t_users;-- ,代入引數sql語句就變成了:"update t_users set login_ip='***.***.***.***';delete from t_users;-- where ...

所以獲取ip位址後,務必使用正則等對ip位址的有效性進行驗證,另外一定要使用引數化sql命令!

總結:

"x-forwarded-for" 是**伺服器通過 http headers 提供的客戶端ip。**伺服器可以偽造任何ip。

要防止偽造,不要讀這個ip即可(同時告訴使用者不要用http **)。

如果是php,$_server['remote_addr'] 就是跟你伺服器直接連線的ip,用這個就可以了。

/*

* * 獲取服務端ip位址

* @return string

* @since 1.0 2016-7-1 sochishun added. */

function

get_host_ip()

PHP 獲取 ip 位址

remote addr 是你的客戶端跟你的伺服器 握手 時候的ip。如果使用了 匿名 remote addr將顯示 伺服器的ip。http client ip 是 伺服器傳送的http頭。如果是 超級匿名 則返回none值。同樣,remote addr也會被替換為這個 伺服器的ip。server r...

獲取IP位址方法

方法一 方法二 方法三 string strhostname system.net.dns.gethostname string clientipaddress system.net.dns.gethostaddresses strhostname getvalue 0 tostring 但如果客戶...

PHP獲取各個IP位址

主要有兩種 ip與客戶端ip 客戶端 沒有 的話是真實的ip 有 的話 是最後乙個 伺服器的ip ipone server remote addr var dump 最後乙個 ip ipone 因為沒有使用多個 127.0.0.1表示監視本地 所以不會顯示數值 var dump 客戶端真實ip ip...