2011-12-31 2 views
4

ウェブサイトでHTMLを使用して訪問者のIPアドレスを検出するにはどうすればよいですか? 私はcontactform.htmlとformsent.htmlを持っています。 そしてformsent.htmlが私の電子メールに連絡先情報を送るとき、私はまたIPアドレスを見たいと思っています!HTMLを使用して訪問者のIPアドレスを検出するにはどうすればよいですか?

+2

これはHTML(またはJavaScript)から取得しません。 contactform.htmlを処理するスクリプトから取得します。 –

答えて

11

などPHP、ASP、として、プログラミング言語を使用する必要があります。しかし、訪問者のIPアドレスはPHPを通して見つけることができます。

$ip=$_SERVER['REMOTE_ADDR']; 
3

HTMLだけではできません。

HTTPヘッダーが利用できるスクリプトを使用する必要があります。

JSONPを使用してthis SO answerを参照してください。

PHPの場合、$_SERVER['REMOTE_HOST']を使用します。

3

できません。

HTMLはプログラミング言語ではなくマークアップ言語です。それは何もしません - コンテンツを構成するだけです。

あなたはあなたがHTMLを通じてそれを行うことはできません

+0

どうすればPHPで使用できますか? – LukeyBoyIsXen

+0

@LukeyBoyIsXen use $ _SERVER ['REMOTE_HOST'] –

1

HTMLはマークアップ言語なので、変数はありません。

PHPを使用したい場合は、$ _SERVERスーパーグローバル変数を使用する必要があります。解決策は次のようになります。

echo $_SERVER["REMOTE_ADDR"]; 

しかしこれは最も基本的であり、ユーザは彼らが自明それを変更できるようにするだけでなく、プロキシの背後にある場合は失敗します。ずっとずっと良い方法は、のようなものを使用することです:

function get_ip_address() { 
  // check for shared internet/ISP IP 
  if (!empty($_SERVER['HTTP_CLIENT_IP']) && $this->validate_ip($_SERVER['HTTP_CLIENT_IP'])) 
   return $_SERVER['HTTP_CLIENT_IP']; 

  // check for IPs passing through proxies 
  if (!empty($_SERVER['HTTP_X_FORWARDED_FOR'])) { 
   // check if multiple ips exist in var 
    $iplist = explode(',', $_SERVER['HTTP_X_FORWARDED_FOR']); 
    foreach ($iplist as $ip) { 
     if ($this->validate_ip($ip)) 
      return $ip; 
    } 
   } 

  if (!empty($_SERVER['HTTP_X_FORWARDED']) && $this->validate_ip($_SERVER['HTTP_X_FORWARDED'])) 
   return $_SERVER['HTTP_X_FORWARDED']; 
  if (!empty($_SERVER['HTTP_X_CLUSTER_CLIENT_IP']) && $this->validate_ip($_SERVER['HTTP_X_CLUSTER_CLIENT_IP'])) 
   return $_SERVER['HTTP_X_CLUSTER_CLIENT_IP']; 
  if (!empty($_SERVER['HTTP_FORWARDED_FOR']) && $this->validate_ip($_SERVER['HTTP_FORWARDED_FOR'])) 
   return $_SERVER['HTTP_FORWARDED_FOR']; 
  if (!empty($_SERVER['HTTP_FORWARDED']) && $this->validate_ip($_SERVER['HTTP_FORWARDED'])) 
   return $_SERVER['HTTP_FORWARDED']; 

  // return unreliable ip since all else failed 
  return $_SERVER['REMOTE_ADDR']; 
 } 

function validate_ip($ip) { 
     if (filter_var($ip, FILTER_VALIDATE_IP,  
                         FILTER_FLAG_IPV4 |  
                         FILTER_FLAG_IPV6 | 
                         FILTER_FLAG_NO_PRIV_RANGE |  
                         FILTER_FLAG_NO_RES_RANGE) === false) 
         return false; 
     self::$ip = $ip; 
     return true; 
 } 

(http://stackoverflow.com/questions/1634782/what-is-the-most-accurate-way-to-retrieve-a-users -correct-ip-address-in-php)

これはHTTP_X_FORWARDED_FORフィールドを正しく解析し、IPを検証してプライベートブロックではなく正しいフォーマットであることを確認します。

+0

これは、ユーザーが自らのアドレスを偽装する可能性もカバーします。また、REMOTE_ADDRは常に設定されるため、残りは使用されません。 – deceze

+0

あなたは正しいです。私はラウンドを変更して、最初に転送をチェックし、次に転送をチェックします。実際、この全体的な答えは駄目です。私はより良いものに書き直しています。 –

+0

編集中のIPアドレスの値は何ですか? – LukeyBoyIsXen

8

次のスクリプトが役に立ちます。コピーして保存することができます。{whateveryouwant}.php

<?php 

echo "Your IP is"; 

echo $_SERVER["REMOTE_ADDR"]; 

function get_ip_address() { 
    // check for shared internet/ISP IP 
    if (!empty($_SERVER['HTTP_CLIENT_IP']) && $this->validate_ip($_SERVER['HTTP_CLIENT_IP'])) 
    return $_SERVER['HTTP_CLIENT_IP']; 

    // check for IPs passing through proxies 
    if (!empty($_SERVER['HTTP_X_FORWARDED_FOR'])) { 
    // check if multiple ips exist in var 
    $iplist = explode(',', $_SERVER['HTTP_X_FORWARDED_FOR']); 
    foreach ($iplist as $ip) { 
    if ($this->validate_ip($ip)) 
     return $ip; 
    } 
    } 

    if (!empty($_SERVER['HTTP_X_FORWARDED']) && $this->validate_ip($_SERVER['HTTP_X_FORWARDED'])) 
    return $_SERVER['HTTP_X_FORWARDED']; 
    if (!empty($_SERVER['HTTP_X_CLUSTER_CLIENT_IP']) && $this->validate_ip($_SERVER['HTTP_X_CLUSTER_CLIENT_IP'])) 
    return $_SERVER['HTTP_X_CLUSTER_CLIENT_IP']; 
    if (!empty($_SERVER['HTTP_FORWARDED_FOR']) && $this->validate_ip($_SERVER['HTTP_FORWARDED_FOR'])) 
    return $_SERVER['HTTP_FORWARDED_FOR']; 
    if (!empty($_SERVER['HTTP_FORWARDED']) && $this->validate_ip($_SERVER['HTTP_FORWARDED'])) 
    return $_SERVER['HTTP_FORWARDED']; 

    // return unreliable ip since all else failed 
    return $_SERVER['REMOTE_ADDR']; 
} 

function validate_ip($ip) { 
    if (filter_var($ip, FILTER_VALIDATE_IP, 
         FILTER_FLAG_IPV4 | 
         FILTER_FLAG_IPV6 | 
         FILTER_FLAG_NO_PRIV_RANGE | 
         FILTER_FLAG_NO_RES_RANGE) === false) 
     return false; 
    self::$ip = $ip; 
    return true; 
} 
?> 
関連する問題