PHPでイントラネットユーザーMACアドレス(WINDOWS/linux)を取得する実装コード

3492 ワード

 
  
function ce_getmac()
{
if(PHP_OS == 'WINNT')
{
$return_array = array();
$temp_array = array();
$mac_addr = "";
@exec("arp -a",$return_array);
foreach($return_array as $value)
{
if(strpos($value,$_SERVER["HTTP_CLIENT_IP"]) !== false &&
preg_match("/(:?[0-9a-f]{2}[:-]){5}[0-9a-f]{2}/i",$value,$temp_array))
{
$mac_addr = $temp_array[0];
break;
}
}
return $mac_addr ? strtoupper($mac_addr) : '';
}
else if(PHP_OS == 'Linux')
{
return true;
}
}

関数は既に修正されており,LINUXではEXEC関数が使用できないこと,すなわちMACアドレスが取得できないことが分かった.コミュニケーションを経て、このプロジェクトはLINUXサーバーの下に配置しなければならない.筆者は長い間瞑想してやっと解決策を見つけた.EXECを実行しなくてもイントラネットユーザーのMACアドレスを得ることができる.
イントラネットサーバには192.168が1台ある.1.151のサーバー、サーバーの前のAPI、このAPIにアクセスして、ユーザーMACを取得して、JOSNの方式はユーザーアカウント情報を出力して、このサーバーはMACを取得することができて、少し利用することができます.
CURLを使用してソースIP方式を偽造する(IPはLINUXサーバのIPではなく、クライアントアクセスのIPアドレスである)、CURL~151サーバは、サーバに対応付けられ、ユーザIPアドレスとARP-Aパラメータの正規方式によりクライアントのMACアドレスを得ることができ、プログラムは151で実行され、151はWINDOWS 2008サーバである.ただし、REMOTE_ADDRは使用できず、HTTP_CLIENT_IPを使用しなければならない.理由はHTTP_CであるLIENT_IPはCURLを用いて偽造することができ、これによりLINUXを用いてユーザIPを取得し、151に送信することができる.
質問:ユーザーのIPによってMACアドレスを取得しますが、ユーザーがIPを交換したらどうしますか?CMDを用いたARP−A分析では,ユーザがIPを交換しても,ユーザのはずのこのコンピュータのMACアドレスはデフォルトでは交換されない.
以下はネットユーザーのIP取得に関する文章を抜粋します.
dzのコードはIPのあれがあまりにも人を悩ませることを判断して、日、REMOTE_ADDR,HTTP_CLIENT_IP,HTTP_X_FORWARDED_FORの3つのものはマニュアルに詳しくないので、基本的にはありません.
ネット上でggして、少し探し当てて、また、1つの構想があまりにも巧みで、JSでIPを取ってからPOSTでサーバーに着いて、Yのは代理でサーバーをだましますか?インターネットでまずJsをオフにしましょう!!あはは、後でajaxで試してみる機会があって、この3つの変数ifで死ぬのを省くことができます.
$_SERVER['...'];//for php
一、プロキシサーバーを使用していない場合:
REMOTE_ADDR=IP
HTTP_VIA=数値なしまたは非表示
HTTP_X_FORWARDED_FOR=数値なしまたは非表示
二、透明プロキシサーバーを使用する場合:Transparent Proxies
REMOTE_ADDR=最後のプロキシサーバIP
HTTP_VIA=プロキシサーバIP
HTTP_X_FORWARDED_FOR=実際のIPは、複数のプロキシサーバを通過する場合、この値は次のようになります:203.98.182.163, 203.98.182.163, 203.129.72.215.
このようなエージェント・サーバは、アクセス・オブジェクトに情報を転送しても、実際のアイデンティティを隠すことはできません.
三、一般匿名プロキシサーバーを使用する場合:Anonymous Proxies
REMOTE_ADDR=最後のプロキシサーバIP
HTTP_VIA=プロキシサーバIP
HTTP_X_FORWARDED_FOR=プロキシサーバIPであり、複数のプロキシサーバを通過する場合、この値は次のようになる:203.98.182.163, 203.98.182.163, 203.129.72.215.
実際のIPは非表示ですが、プロキシ・サーバを使用してアクセスしていることがアクセス・オブジェクトに明らかになりました.
四、欺瞞エージェントサーバーを使用する場合:Distorting Proxies
REMOTE_ADDR=プロキシサーバIP
HTTP_VIA=プロキシサーバIP
HTTP_X_FORWARDED_FOR=ランダムなIPで、複数のプロキシサーバを通過する場合、この値は次のようになります:203.98.182.163, 203.98.182.163, 203.129.72.215.
アクセス先にエージェントサーバを使用していることを伝えましたが、実際のIPの代わりに虚偽のランダムIPを作成しました.
五、高匿名エージェントサーバーを使用する場合:High Anonymity Proxies(Elite proxies)
REMOTE_ADDR=プロキシサーバIP
HTTP_VIA=数値なしまたは非表示
HTTP_X_FORWARDED_FOR=数値がない、または表示しない、複数のプロキシサーバを通過する場合、この値は次のようになります:203.98.182.163, 203.98.182.163, 203.129.72.215.
すべての情報をプロキシサーバの情報に置き換え、そのプロキシサーバを完全に使用してオブジェクトに直接アクセスするようにします.
REMOTE_ADDRはあなたのクライアントがあなたのサーバーと「握手」したときのIPです.「匿名エージェント」を使用している場合、REMOTE_ADDRには、プロキシサーバのIPが表示されます.
HTTP_CLIENT_IPはプロキシサーバが送信するHTTPヘッダである.スーパー匿名エージェントの場合はnone値を返します.同様に、REMOTE_ADDRもこのプロキシサーバのIPに置き換えられる.
$_SERVER['REMOTE_ADDR'];//アクセス側(ユーザである可能性があり、エージェントである可能性がある)IP
$_SERVER['HTTP_CLIENT_IP'];//エージェント側(存在可能、偽造可能)
$_SERVER['HTTP_X_FORWARDED_FOR'];//ユーザがどのIPで使用するエージェントであるか(存在する可能性もあり偽造も可能)