原文:
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...