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

PHP獲取IP地址的方法,防止偽造IP地址注入攻擊
原文:PHP獲取IP地址的方法,防止偽造IP地址注入攻擊

PHP獲取IP地址的方法

/*** 獲取客戶端IP地址* <br />來源:ThinkPHP* <br />"X-FORWARDED-FOR" 是代理服務器通過 HTTP Headers 提供的客戶端IP。代理服務器可以偽造任何IP。* <br />要防止偽造,不要讀這個IP即可(同時告訴用戶不要用HTTP 代理)。* @param integer $type 返回類型 0 返回IP地址 1 返回IPV4地址數字* @param boolean $adv 是否進行高級模式獲取(有可能被偽裝) * @return mixed*/
function get_client_ip($type = 0, $adv = false) {$type = $type ? 1 : 0;static $ip = NULL;if ($ip !== NULL)return $ip[$type];if ($adv) {if (isset($_SERVER['HTTP_X_FORWARDED_FOR'])) {$arr = explode(',', $_SERVER['HTTP_X_FORWARDED_FOR']);$pos = array_search('unknown', $arr);if (false !== $pos)unset($arr[$pos]);$ip = trim($arr[0]);}elseif (isset($_SERVER['HTTP_CLIENT_IP'])) {$ip = $_SERVER['HTTP_CLIENT_IP'];} elseif (isset($_SERVER['REMOTE_ADDR'])) {$ip = $_SERVER['REMOTE_ADDR'];}} elseif (isset($_SERVER['REMOTE_ADDR'])) {$ip = $_SERVER['REMOTE_ADDR'];}// IP地址合法驗證, 防止通過IP注入攻擊$long = sprintf("%u", ip2long($ip));$ip = $long ? array($ip, $long) : array('0.0.0.0', 0);return $ip[$type];
}/*** 獲得用戶的真實IP地址* <br />來源:ecshop* <br />$_SERVER和getenv的區別,getenv不支持IIS的isapi方式運行的php* @access  public* @return  string*/
function real_ip() {static $realip = NULL;if ($realip !== NULL) {return $realip;}if (isset($_SERVER)) {if (isset($_SERVER['HTTP_X_FORWARDED_FOR'])) {$arr = explode(',', $_SERVER['HTTP_X_FORWARDED_FOR']);/* 取X-Forwarded-For中第一個非unknown的有效IP字符串 */foreach ($arr AS $ip) {$ip = trim($ip);if ($ip != 'unknown') {$realip = $ip;break;}}} elseif (isset($_SERVER['HTTP_CLIENT_IP'])) {$realip = $_SERVER['HTTP_CLIENT_IP'];} else {if (isset($_SERVER['REMOTE_ADDR'])) {$realip = $_SERVER['REMOTE_ADDR'];} else {$realip = '0.0.0.0';}}} else {if (getenv('HTTP_X_FORWARDED_FOR')) {$realip = getenv('HTTP_X_FORWARDED_FOR');} elseif (getenv('HTTP_CLIENT_IP')) {$realip = getenv('HTTP_CLIENT_IP');} else {$realip = getenv('REMOTE_ADDR');}}// 使用正則驗證IP地址的有效性,防止偽造IP地址進行SQL注入攻擊preg_match("/[\d\.]{7,15}/", $realip, $onlineip);$realip = !empty($onlineip[0]) ? $onlineip[0] : '0.0.0.0';return $realip;
}

X-Forwarded-For地址形式列舉:
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數據包,有興趣的可以去看看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地址是:xxx.xxx.xxx.xxx';delete from t_users;-- ,代入參數SQL語句就變成了:"update t_users set login_ip='xxx.xxx.xxx.xxx';delete from t_users;-- where ...
所以獲取IP地址后,務必使用正則等對IP地址的有效性進行驗證,另外一定要使用參數化SQL命令!

總結:

"X-FORWARDED-FOR" 是代理服務器通過 HTTP Headers 提供的客戶端IP。代理服務器可以偽造任何IP。
要防止偽造,不要讀這個IP即可(同時告訴用戶不要用HTTP 代理)。
如果是PHP,$_SERVER['REMOTE_ADDR'] 就是跟你服務器直接連接的IP,用這個就可以了。

?

獲取服務器IP地址:

/*** 獲取服務端IP地址* @return string* @since 1.0 2016-7-1 SoChishun Added.*/
function get_host_ip() {return isset($_SERVER['HTTP_X_FORWARDED_HOST']) ? $_SERVER['HTTP_X_FORWARDED_HOST'] : (isset($_SERVER['HTTP_HOST']) ? $_SERVER['HTTP_HOST'] : '');
}

?

參考文章:

http://www.cnblogs.com/skiplow/archive/2011/07/20/2111751.html (偽造IP地址進行SYN洪水攻擊)
http://www.feifeiboke.com/pcjishu/3391.html (你所不懂的火狐瀏覽器妙用之偽造IP地址)
https://segmentfault.com/q/1010000000095850#a-1020000000098537 (如何避免用戶訪問請求偽造ip)
http://blog.csdn.net/clh604/article/details/9234473 (PHP使用curl偽造IP地址和header信息)
http://www.cnblogs.com/lmule/archive/2010/10/15/1852020.html (REMOTE_ADDR,HTTP_CLIENT_IP,HTTP_X_FORWARDED_FOR)

?

版權聲明:本文采用署名-非商業性使用-相同方式共享(CC BY-NC-SA 3.0 CN)國際許可協議進行許可,轉載請注明作者及出處。
本文標題:PHP獲取IP地址的方法,防止偽造IP地址注入攻擊
本文鏈接:http://www.cnblogs.com/sochishun/p/7168860.html
本文作者:SoChishun (郵箱:14507247#qq.com | 博客:http://www.cnblogs.com/sochishun/)
發表日期:2017年7月14日

posted on 2018-09-20 17:41 NET未來之路 閱讀(...) 評論(...) 編輯 收藏

轉載于:https://www.cnblogs.com/lonelyxmas/p/9682236.html

本文來自互聯網用戶投稿,該文觀點僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務,不擁有所有權,不承擔相關法律責任。
如若轉載,請注明出處:http://www.pswp.cn/news/388462.shtml
繁體地址,請注明出處:http://hk.pswp.cn/news/388462.shtml
英文地址,請注明出處:http://en.pswp.cn/news/388462.shtml

如若內容造成侵權/違法違規/事實不符,請聯系多彩編程網進行投訴反饋email:809451989@qq.com,一經查實,立即刪除!

相關文章

工作10年厭倦寫代碼_厭倦了數據質量討論?

工作10年厭倦寫代碼I have been in tons of meetings where data and results of any sort of analysis have been presented. And most meetings have one thing in common, data quality is being challenged and most of the meeting time is used for discussing potential…

Java基礎回顧

內容&#xff1a; 1、Java中的數據類型 2、引用類型的使用 3、IO流及讀寫文件 4、對象的內存圖 5、this的作用及本質 6、匿名對象 1、Java中的數據類型 Java中的數據類型有如下兩種&#xff1a; 基本數據類型: 4類8種 byte(1) boolean(1) short(2) char(2) int(4) float(4) l…

oracle數據庫 日志滿了

1、 數據庫不能啟動SQL> startupORACLE 例程已經啟動。Total System Global Area 289406976 bytesFixed Size 1248576 bytesVariable Size 83886784 bytesDatabase Buffers 197132288 bytesRedo Buffers 7139328 byt…

計算機應用基礎學生自查報告,計算機應用基礎(專科).docx

1.在資源管理器中&#xff0c;如果要選擇連續多個文件或文件夾&#xff0c;需要單擊第一個文件或文件夾&#xff0c;按下鍵盤()&#xff0c;再用鼠標單擊最后一個文件或文件夾即可。(A)Shift(B)Tab(C)Alt(D)Ctrl分值&#xff1a;2完全正確?得分&#xff1a;2?2.下列數據能被E…

Random隨機數

Random 隨機數 1 產生隨機數 1.1 Random的使用步驟 我們想產生1-100(包含1和100)的隨機數該怎么辦&#xff1f;我們不需要自己寫算法&#xff0c;因為額Java已經為我們提供好了產生隨機數的類---Random 作用&#xff1a;用于產生一個隨機數 使用步驟(和Scanner類似)&#xff1a…

模擬一個簡單計算器_閱讀模擬器的簡單介紹

模擬一個簡單計算器Read simulators are widely being used within the research community to create synthetic and mock datasets for analysis. In this article, I will introduce some recently proposed, commonly used read simulators.閱讀模擬器在研究社區中被廣泛使…

計算機部分應用顯示模糊,win10系統打開部分軟件字體總顯示模糊的解決方法-電腦自學網...

win10系統打開部分軟件字體總顯示模糊的解決方法。方法一&#xff1a;win10軟件字體模糊1、首先&#xff0c;在Win10的桌面點擊鼠標右鍵&#xff0c;選擇“顯示設置”。2、在“顯示設置”的界面下方&#xff0c;點擊“高級顯示設置”。3、在“高級顯示設置”的界面中&#xff0…

Tomcat調節

Tomcat默認可以使用的內存為128MB&#xff0c;在較大型的應用項目中&#xff0c;這點內存是不夠的&#xff0c;需要調大,并且Tomcat本身不能直接在計算機上運行&#xff0c;需要依賴于硬件基礎之上的操作系統和一個java虛擬機。 AD&#xff1a; 這里向大家描述一下如何使用Tom…

假如不工作了,你還有源源不斷的收入嗎?

擁有金山跟銀礦&#xff0c;其實不值得羨慕。俗話說&#xff1a;授人以魚不如授人以漁。與其選擇萬貫家財&#xff0c;倒不如選擇一個會持續冒出錢的杯子。很多人害怕上班的收入不確定&#xff0c;上班族急于尋找雙薪&#xff0c;下班之后還要辛勤工作&#xff0c;以為這樣就可…

turtle 20秒畫完小豬佩奇“社會人”

轉載&#xff1a;https://blog.csdn.net/csdnsevenn/article/details/80650456 圖片源自網絡 作者 丁彥軍 如需轉載&#xff0c;請聯系原作者授權。 今年社交平臺上最火的帶貨女王是誰&#xff1f;范冰冰&#xff1f;楊冪&#xff1f;Angelababy&#xff1f;不&#xff0c;是豬…

最佳子集aic選擇_AutoML的起源:最佳子集選擇

最佳子集aic選擇As there is a lot of buzz about AutoML, I decided to write about the original AutoML; step-wise regression and best subset selection. Then I decided to ignore step-wise regression because it is bad and should probably stop being taught. That…

Java虛擬機內存溢出

最近在看周志明的《深入理解Java虛擬機》&#xff0c;雖然剛剛開始看&#xff0c;但是覺得還是一本不錯的書。對于和我一樣對于JVM了解不深&#xff0c;有志進一步了解的人算是一本不錯的書。注明&#xff1a;不是書托&#xff0c;同樣是華章出的書&#xff0c;質量要比《深入剖…

spring boot構建

1.新建Maven工程 1.File-->new-->project-->maven project 2.webapp 3.工程名稱 k3 2.Maven 三個常用命令 選 項目右擊- >run-> Maven clean&#xff0c;一般新工程&#xff0c;新導入工程用這個命令清理clean Mvaen install&#xff0c; Maven test&#xff0c…

用戶輸入漢字時計算機首先將,用戶輸入漢字時,計算機首先將漢字的輸入碼轉換為__________。...

用戶的蓄的形能器常見式有。輸入時計算機首先輸入包括藥物具有基的酚羥。漢字換物包腺皮括質激腎上素藥。對既荷又有線有相間負負荷時&#xff0c;將漢倍作為等選取相負效三相負荷乘荷最大&#xff0c;將漢相負荷換荷應先將線間負算為&#xff0c;效三相負荷時在計算等&#xf…

從最終用戶角度來看外部結構_從不同角度來看您最喜歡的游戲

從最終用戶角度來看外部結構The complete python code and Exploratory Data Analysis Notebook are available at my github profile;完整的python代碼和Exploratory Data Analysis Notebook可在我的github個人資料中找到 &#xff1b; Pokmon is a Japanese media franchise,…

apache+tomcat配置

無意間看到tomcat 6集群的內容&#xff0c;就嘗試配置了一下&#xff0c;還是遇到很多問題&#xff0c;特此記錄。apache服務器和tomcat的連接方法其實有三種:JK、http_proxy和ajp_proxy。本文主要介紹最為常見的JK。 環境&#xff1a;PC2臺&#xff1a;pc1(IP 192.168.88.118…

記自己在spring中使用redis遇到的兩個坑

本人在spring中使用redis作為緩存時&#xff0c;遇到兩個坑&#xff0c;現在記錄如下&#xff0c;算是作為自己的備忘吧&#xff0c;文筆不好&#xff0c;望大家見諒&#xff1b; 一、配置文件 1 <!-- 加載Properties文件 -->2 <bean id"configurer" cl…

Azure實踐之如何批量為資源組虛擬機創建alert

通過上一篇的簡介&#xff0c;相信各位對于簡單的創建alert&#xff0c;以及Azure monitor使用以及大概有個印象了。基礎的使用總是非常簡單的&#xff0c;這里再分享一個常用的alert使用方法實際工作中&#xff0c;不管是日常運維還是做項目&#xff0c;我們都需要知道VM的實際…

南信大濱江學院計算機基礎,南京信息工程大學濱江學院計算機基礎期末復習知識點...

《計算機基礎》期末考試復習知識點第一章計算機基礎知識1.第一臺電子計算機的名稱、誕生時間及運算性能&#xff1b;名稱&#xff1a;電子數字積分計算機ENIAC(埃尼阿克)。誕生時間&#xff1a;1946年2月14日。運算性能&#xff1a;運算速度為每秒5000次加法。2.計算機發展四個…

nginx集群

今天看到"基于apache的tomcat負載均衡和集群配置 "這篇文章成為javaEye熱點。 略看了一下&#xff0c;感覺太復雜&#xff0c;要配置的東西太多&#xff0c;因此在這里寫出一種更簡潔的方法。 要集群tomcat主要是解決SESSION共享的問題&#xff0c;因此我利用memc…