欧美bbbwbbbw肥妇,免费乱码人妻系列日韩,一级黄片

PHP?獲取客戶端真實(shí)IP地址

 更新時(shí)間:2023年12月24日 15:39:08   作者:軼哥  
PHP獲取客戶端真實(shí)IP地址,只要根據(jù)實(shí)際部署情況選擇相對(duì)應(yīng)的代碼獲取訪客IP地址,是可以確保程序不被假IP欺騙的

PHP獲取客戶端真實(shí)IP地址,需要根據(jù)具體的服務(wù)器環(huán)境來(lái)確定使用哪種方法。目前搜索到的方法,大多是直接貼代碼,沒有針對(duì)不同情況作出說(shuō)明,有可能導(dǎo)致系統(tǒng)被假IP騙過(guò)(IP欺騙)。

很多文章都提到“無(wú)法保證獲取到的訪客IP地址100%準(zhǔn)確”,是否意味著PHP獲取訪客IP一定有漏洞可鉆呢?

只要根據(jù)實(shí)際部署情況選擇相對(duì)應(yīng)的代碼獲取訪客IP地址,是可以確保程序不被假IP欺騙的。

PHP的運(yùn)行方式

PHP支持非常多的運(yùn)行方式,例如php-cgi、php-fpm、swoole、php-cli、php-mod等。其中,php-fpm是php的fast-cgi的進(jìn)程管理器。php-mod通常配合Apache使用,而php-fpm通常配合Nginx使用。從PHP5.4開始,PHP甚至可以以內(nèi)置PHP服務(wù)(Buid-in web server)方式運(yùn)行。逐漸的,PHP形成了很多經(jīng)典搭配,例如LAMP、LNMP、LNMPA、IIS+PHP。

無(wú)論采用哪種PHP運(yùn)行方式,分清是誰(shuí)傳遞IP給PHP程序即可。這里對(duì)幾種常見環(huán)境進(jìn)行分析。

無(wú)代理層(PHP內(nèi)置服務(wù)器/swoole)

由于客戶端IP數(shù)據(jù)是從TCP/IP協(xié)議層傳遞過(guò)來(lái)的,因此在沒有中間代理(客戶端和服務(wù)器直連)的情況下,可以直接通過(guò)標(biāo)準(zhǔn)方法REMOTE_ADDR獲得與PHP直接通訊的IP地址。

例如$_SERVER['REMOTE_ADDR']getenv("REMOTE_ADDR")。

而在swoole中,可以通過(guò)$request->server['remote_addr']獲得客戶端IP地址。

在這種情況下,REMOTE_ADDR不可以顯式的偽造,獲取到的是實(shí)際與服務(wù)器連接的IP地址,是可靠的。

Nginx代理(Nginx + php-fpm / Nginx + swoole)

常見的LNMP方案,屬于Nginx反向代理。Nginx與php的通訊,無(wú)論unix socket方式還是tcp socket方式,都跟Nginx的Header配置有關(guān)系。

proxy_http_version 1.1;
proxy_set_header X-Real-IP $remote_addr;
proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
proxy_set_header Host $http_host;
proxy_set_header X-NginX-Proxy true;
proxy_set_header Upgrade $http_upgrade;
proxy_set_header Connection "upgrade";

可以在第一層nginx代理設(shè)置 proxy_set_header X-Forwarded-For $remote_addr,

其他層nginx代理設(shè)置proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for

這樣就可以通過(guò)X-Forwarded-For獲取客戶端真實(shí)IP地址。

如果設(shè)置了X-Real-IP $remote_addr,則通過(guò)X-Real-IP獲取客戶端IP地址。

PHP代碼:

// php-fpm等
$_SERVER['HTTP_X_FORWARDED_FOR']);

// swoole
$this->http_input->header('x-real-ip');

總結(jié)來(lái)說(shuō),當(dāng)有Nginx代理的情況下,需要根據(jù)具體配置來(lái)選擇獲取的Header,從而正確獲取客戶端IP地址,此時(shí)PHP中的的REMOTE_ADDR可能是最后一級(jí)代理的IP地址。

Apache代理(Apache + php_mod / Apache + php-fpm)

通常在Apache + PHP方案中,獲取IP地址取決于Apache配置信息。

絕大部分情況可以使用$_SERVER["REMOTE_ADDR"]獲取到真實(shí)客戶端IP地址。

如果Apache上級(jí)存在Nginx,那么可以在Apache中使用mod_rpaf模塊將客戶端IP地址傳遞到X-Forwarded-For頭中。

PAFheader X-Forwarded-For

負(fù)載均衡/云虛擬機(jī)/Serverless

在負(fù)載均衡條件下,需要查閱對(duì)應(yīng)負(fù)載均衡程序的文檔,來(lái)決定使用哪種方法獲取真實(shí)客戶端IP地址。

在大部分虛擬主機(jī)、負(fù)載均衡及無(wú)服務(wù)器中,可以通過(guò)HTTP_CLIENT_IPHTTP_X_FORWARDED_FORX-REAL-IP其一得知客戶端IP地址。但是不建議對(duì)多種來(lái)源進(jìn)行空值判斷,這樣容易被偽造者利用,從而實(shí)現(xiàn)IP欺騙。

目前并未有標(biāo)準(zhǔn)規(guī)定將客戶端IP地址放入名為CLIENT_IP的環(huán)境變量,但是有不少老虛擬主機(jī)供應(yīng)商這樣做。新的提供商都不再使用該環(huán)境變量。網(wǎng)上大量的PHP文章中都是優(yōu)先獲取HTTP_CLIENT_IP的值,因此導(dǎo)致網(wǎng)上存在大量的服務(wù)器可以被偽造IP欺騙。

可能有該漏洞的代碼:

<?php
if(!empty($_SERVER['HTTP_CLIENT_IP'])) {
    $ip = $_SERVER['HTTP_CLIENT_IP'];
} elseif (isset($_SERVER['REMOTE_ADDR']) && $_SERVER['REMOTE_ADDR'] && strcasecmp($_SERVER['REMOTE_ADDR'], 'unknown')) {
    $ip = $_SERVER['REMOTE_ADDR'];
}

IIS + PHP

這種情況下直接使用$_SERVER['REMOTE_ADDR']方法即可。

總結(jié)

無(wú)論是哪種情況,如果用戶使用匿名代理訪問(wèn)服務(wù)器,只能獲取到代理服務(wù)器的IP地址,其IP地址仍然具有參考意義。

獲取客戶端真實(shí)IP地址,此事需要查閱相關(guān)資料根據(jù)具體情況選用某一個(gè)方法,而不是復(fù)制粘貼。

部分方法獲取到的值可能是一個(gè)數(shù)組。

不建議對(duì)獲取到的IP地址進(jìn)行正則過(guò)濾,有可能你獲取到的是一個(gè)IPv6地址。

以上就是PHP 獲取客戶端真實(shí)IP地址的詳細(xì)內(nèi)容,更多關(guān)于PHP 獲取客戶端真實(shí)IP地址的資料請(qǐng)關(guān)注腳本之家其它相關(guān)文章!

相關(guān)文章

  • php去除數(shù)組中重復(fù)數(shù)據(jù)

    php去除數(shù)組中重復(fù)數(shù)據(jù)

    去除數(shù)組中的重復(fù)數(shù)據(jù),又叫排重,本文給出的函數(shù)和php原生array_unique的區(qū)別在于array_unique要求是字符串,而本函數(shù)可以是數(shù)組和對(duì)象
    2014-11-11
  • laravel使用Faker數(shù)據(jù)填充的實(shí)現(xiàn)方法

    laravel使用Faker數(shù)據(jù)填充的實(shí)現(xiàn)方法

    這篇文章主要給大家介紹了關(guān)于laravel使用Faker數(shù)據(jù)填充的相關(guān)資料,文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家學(xué)習(xí)或者使用laravel具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面來(lái)一起學(xué)習(xí)學(xué)習(xí)吧
    2019-04-04
  • Laravel框架中VerifyCsrfToken報(bào)錯(cuò)問(wèn)題的解決

    Laravel框架中VerifyCsrfToken報(bào)錯(cuò)問(wèn)題的解決

    這篇文章主要給大家介紹了關(guān)于Laravel框架中VerifyCsrfToken報(bào)錯(cuò)問(wèn)題的解決方法,文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí),需要的朋友們下面跟著小編來(lái)一起學(xué)習(xí)學(xué)習(xí)吧。
    2017-08-08
  • Yaf框架封裝的MySQL數(shù)據(jù)庫(kù)操作示例

    Yaf框架封裝的MySQL數(shù)據(jù)庫(kù)操作示例

    這篇文章主要介紹了Yaf框架封裝的MySQL數(shù)據(jù)庫(kù)操作,結(jié)合實(shí)例形式分析了Yaf框架基于PDO操作MySQL數(shù)據(jù)庫(kù)的相關(guān)配置、連接、增刪改查、統(tǒng)計(jì)等相關(guān)操作技巧,需要的朋友可以參考下
    2019-03-03
  • 淺談PHP各環(huán)境下的偽靜態(tài)配置

    淺談PHP各環(huán)境下的偽靜態(tài)配置

    這篇文章主要介紹了PHP各環(huán)境下的偽靜態(tài)配置,文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來(lái)一起學(xué)習(xí)學(xué)習(xí)吧
    2019-03-03
  • Zend Framework框架路由機(jī)制代碼分析

    Zend Framework框架路由機(jī)制代碼分析

    這篇文章主要介紹了Zend Framework框架路由機(jī)制,結(jié)合代碼分析了Zend Framework路由機(jī)制所涉及的控制器,路由器原理與相關(guān)代碼實(shí)現(xiàn)技巧,需要的朋友可以參考下
    2016-03-03
  • 淺析ThinkPHP的模板輸出功能

    淺析ThinkPHP的模板輸出功能

    這篇文章主要介紹了ThinkPHP的模板輸出功能,需要的朋友可以參考下
    2014-07-07
  • 使用php實(shí)現(xiàn)從身份證中提取生日

    使用php實(shí)現(xiàn)從身份證中提取生日

    本文給大家分享的是一則使用php實(shí)現(xiàn)的從身份證中提取出生日期的函數(shù),非常的簡(jiǎn)單,有需要的小伙伴可以參考下
    2016-05-05
  • thinkphp數(shù)據(jù)查詢和遍歷數(shù)組實(shí)例

    thinkphp數(shù)據(jù)查詢和遍歷數(shù)組實(shí)例

    這篇文章主要介紹了thinkphp數(shù)據(jù)查詢和遍歷數(shù)組的方法,包括數(shù)據(jù)庫(kù)的DSN方法配置、CURD操作方法以及模板的遍歷數(shù)組等技巧,具有一定的借鑒價(jià)值,需要的朋友可以參考下
    2014-11-11
  • Thinkphp極驗(yàn)滑動(dòng)驗(yàn)證碼實(shí)現(xiàn)步驟解析

    Thinkphp極驗(yàn)滑動(dòng)驗(yàn)證碼實(shí)現(xiàn)步驟解析

    這篇文章主要介紹了Thinkphp極驗(yàn)滑動(dòng)驗(yàn)證碼實(shí)現(xiàn)步驟解析,文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友可以參考下
    2020-11-11

最新評(píng)論