وهو أفضل وسيلة للحصول على الملكية الفكرية

StackOverflow https://stackoverflow.com/questions/1636644

  •  06-07-2019
  •  | 
  •  

سؤال

ما هو أفضل وسيلة للحصول على عنوان IP في PHP:

getenv('REMOTE_ADDR'); 

وأو

$_SERVER['REMOTE_ADDR'];

ومن فضلك قل لي الفرق، إن وجدت، بين البلدين.

هل كانت مفيدة؟

المحلول

وgetenv () يمكن استخدامها للوصول إلى أي متغيرات البيئة (PHP ببساطة يسجل REMOTE_ADDR كما متغير بيئة للبرنامج النصي)، بينما مع _SERVER $ من الواضح أنك فقط الوصول إلى محتويات superglobal $ _SERVER.

والنهج المشترك هو استخدام $ _SERVER لهذا، على الرغم من أنه لا حقا أن تحدث فرقا ظيفة الحكيمة.

نصائح أخرى

و$ _ هو بنيت الخادم في PHP متغير، بينما getenv () تطلب البيئة (وربما أباتشي / IIS) للقيم.

وأفضل طريقة للحصول على IP هي؛

$ip = (!empty($_SERVER['REMOTE_ADDR'])) ? $_SERVER['REMOTE_ADDR'] : getenv('REMOTE_ADDR');

ولكن أشك في أن هناك أي فرق بين هذين المتغيرين ... جلالة الملك.

وربما يكون من الأفضل استخدام   $ _SERVER [ 'REMOTE_ADDR']. لمنع عدم التوافق بين ملقمات.

وليس هناك خلافات بين المكالمات ثو. كما ترون دليل PHP استخدام كل طريقة في نفس المثال. هناك بعض الحالات التي لم يكن لديك المتغيرات العالمية مثل _SERVER $ تمكين وكنت اضطر لاستخدام getenv (). في تجربتي أنا لم أر قط ملقم مع المتغيرات العالمية تعطيل.

ومع $_SERVER['REMOTE_ADDR'] تقرأ مباشرة المتغير العالمي عن طريق الوصول إلى _SERVER $ [] مجموعة التي تم إعدادها عندما يحدث طلب بعيد:

$ _SERVER هي المعلومات التي تحتوي على مجموعة مثل كما الرؤوس والمسارات والمواقع النصي. يتم إنشاء الإدخالات في هذه المجموعة من قبل خادم الويب. ليس هناك ما يضمن أن كل خادم على شبكة الإنترنت سوف توفر أي من هذه. خوادم قد تغفل بعض، أو توفير الآخرين غير المذكورة هنا. قال ذلك، يتم احتساب عدد كبير من هذه المتغيرات لفي »مواصفات CGI 1.1، لذلك يجب أن تكون قادرا على أن يتوقع هؤلاء.

ووgetenv () الدخول إلى الوظيفة إلى أي متغير البيئة للحصول على قيمة ذات الصلة!

في كلتا الحالتين يمكنك الوصول إلى نفس القيمة ونفس متغير ... ولكن $ _SERVER هو بناء في PHP superglobal متغير، بدلا getenv () الحصول على قيمة متغير محددة في البيئة الحالية!

وأعتقد أنه في هذه الحالة استخدام المتغير superglobal هو أفضل وسيلة للحصول على عنوان IP!

وهذه الوظيفة هي مؤرخة قليلا، حتى ظننت انني سوف تتقاسم كيف وأنا على الحصول حاليا على عنوان IP الطلب في كتاباتي PHP، كما كانت هذه المشاركة في الأصل عن على أفضل طريقة للحصول على IP الطلب. هذا هو أفضل وسيلة، وإن لم يكن واحد من الخيارات التي وردت في آخر الأصلي.

وهذا النهج يستخدم مكتبة وظيفة صغيرة لسهولة النقل.

// Function to sanitize IP string
function sanitize_ip($string){
  $string = trim($string); 
  $string = strip_tags($string);
  $string = htmlspecialchars($string, ENT_QUOTES, 'UTF-8');
  $string = str_replace('\n', '', $string);
  $string = trim($string); 
  return $string;
}

// Function to evaluate HTTP headers for IP
function evaluate_ip(){
  $ip_keys =
    array(
      'HTTP_CF_CONNECTING_IP',  'HTTP_CLIENT_IP',            'HTTP_X_FORWARDED_FOR',
      'HTTP_X_FORWARDED',       'HTTP_X_CLUSTER_CLIENT_IP',  'HTTP_X_REAL_IP',
      'HTTP_X_COMING_FROM',     'HTTP_PROXY_CONNECTION',     'HTTP_FORWARDED_FOR',
      'HTTP_FORWARDED',         'HTTP_COMING_FROM',          'HTTP_VIA',
      'REMOTE_ADDR'
    );
  foreach ($ip_keys as $key){
    if (array_key_exists($key, $_SERVER) === true){
      foreach (explode(',', $_SERVER[$key]) as $ip){
        $ip = trim($ip);
        $ip = normalize_ip($ip);
        if (validate_ip($ip)) return $ip;
      }
    }
  }
  // Build error response HTML
  $msg =
    '<div style="width:100%; font-family:serif; font-size:24px; line-height:28px; color:#cc0000; font-weight:bold; text-align:center; padding:10px;">
      ERROR:&nbsp;<span style="color:#ffc107">Invalid IP Address</span>
    </div>';
  echo $msg;
  exit;
}

// Function to normalize IPv4 and IPv6 addresses with port
function normalize_ip($ip){
  // IPv4 with port (e.g., 123.123.123.123:80)
  if (strpos($ip, ':') !== false && substr_count($ip, '.') == 3 && strpos($ip, '[') === false){
    $ip = explode(':', $ip);
    $ip = $ip[0];
  }
  // IPv6 with port (e.g., [::1]:80)
  else {
    $ip = explode(']', $ip);
    $ip = ltrim($ip[0], '[');
  }
  return $ip;
}

// Function to validate IP address
function validate_ip($ip){
  $options  = FILTER_FLAG_IPV4 | FILTER_FLAG_IPV6 | FILTER_FLAG_NO_PRIV_RANGE | FILTER_FLAG_NO_RES_RANGE;
  $filtered = filter_var($ip, FILTER_VALIDATE_IP, $options);
  if (!$filtered || empty($filtered)){
    if (preg_match("/^(([1-9]?[0-9]|1[0-9]{2}|2[0-4][0-9]|25[0-5]).){3}([1-9]?[0-9]|1[0-9]{2}|2[0-4][0-9]|25[0-5])$/", $ip)){
      return $ip; // IPv4
    }
    elseif (preg_match("/^\s*((([0-9A-Fa-f]{1,4}:){7}([0-9A-Fa-f]{1,4}|:))|(([0-9A-Fa-f]{1,4}:){6}(:[0-9A-Fa-f]{1,4}|((25[0-5]|2[0-4]\d|1\d\d|[1-9]?\d)(\.(25[0-5]|2[0-4]\d|1\d\d|[1-9]?\d)){3})|:))|(([0-9A-Fa-f]{1,4}:){5}(((:[0-9A-Fa-f]{1,4}){1,2})|:((25[0-5]|2[0-4]\d|1\d\d|[1-9]?\d)(\.(25[0-5]|2[0-4]\d|1\d\d|[1-9]?\d)){3})|:))|(([0-9A-Fa-f]{1,4}:){4}(((:[0-9A-Fa-f]{1,4}){1,3})|((:[0-9A-Fa-f]{1,4})?:((25[0-5]|2[0-4]\d|1\d\d|[1-9]?\d)(\.(25[0-5]|2[0-4]\d|1\d\d|[1-9]?\d)){3}))|:))|(([0-9A-Fa-f]{1,4}:){3}(((:[0-9A-Fa-f]{1,4}){1,4})|((:[0-9A-Fa-f]{1,4}){0,2}:((25[0-5]|2[0-4]\d|1\d\d|[1-9]?\d)(\.(25[0-5]|2[0-4]\d|1\d\d|[1-9]?\d)){3}))|:))|(([0-9A-Fa-f]{1,4}:){2}(((:[0-9A-Fa-f]{1,4}){1,5})|((:[0-9A-Fa-f]{1,4}){0,3}:((25[0-5]|2[0-4]\d|1\d\d|[1-9]?\d)(\.(25[0-5]|2[0-4]\d|1\d\d|[1-9]?\d)){3}))|:))|(([0-9A-Fa-f]{1,4}:){1}(((:[0-9A-Fa-f]{1,4}){1,6})|((:[0-9A-Fa-f]{1,4}){0,4}:((25[0-5]|2[0-4]\d|1\d\d|[1-9]?\d)(\.(25[0-5]|2[0-4]\d|1\d\d|[1-9]?\d)){3}))|:))|(:(((:[0-9A-Fa-f]{1,4}){1,7})|((:[0-9A-Fa-f]{1,4}){0,5}:((25[0-5]|2[0-4]\d|1\d\d|[1-9]?\d)(\.(25[0-5]|2[0-4]\d|1\d\d|[1-9]?\d)){3}))|:)))(%.+)?\s*$/", $ip)){
      return $ip; // IPv6
    }
    // Build error response HTML
    $msg =
      '<div style="width:100%; font-family:serif; font-size:24px; line-height:28px; color:#cc0000; font-weight:bold; text-align:center; padding:10px;">
        ERROR:&nbsp;<span style="color:#ffc107">Invalid IP Address</span>
      </div>';
    echo $msg;
    exit;
  }
  return $filtered;
}

function get_ip(){
  $ip = evaluate_ip();
  if (preg_match('/(\d{1,3}\.\d{1,3}\.\d{1,3}\.\d{1,3})/', $ip, $ip_match)){
    $ip = $ip_match[1];
  }
  return sanitize_ip($ip);
}


// To Use
$ip = get_ip();

//

وهذا الأمل سوف تساعد شخص الآن في 2018!

مرخصة بموجب: CC-BY-SA مع الإسناد
لا تنتمي إلى StackOverflow
scroll top