虚拟主机域名注册-常见问题云服务器问题 → 安全防护


使用CDN后,如何获取真实IP的办法
作者:

  虚拟主机登录会员或登录后台管理,一般都会获取用户客户端地址并记录数据库.但相同程序部署我司虚拟主机后,获取客户端地址不是用户真实ip地址或为"127.0.0.1",可以通过以下方式修改获取客户ip地址部分代码解决.

  Supesite使用CDN后获取真实IP办法

  include/main.inc.php文件,这部分

  if(getenv('HTTP_CLIENT_IP') && strcasecmp(getenv('HTTP_CLIENT_IP'), 'unknown')) {

  $_SGLOBAL['onlineip'] = getenv('HTTP_CLIENT_IP');

  } elseif(getenv('HTTP_X_FORWARDED_FOR') && strcasecmp(getenv('HTTP_X_FORWARDED_FOR'), 'unknown')) {

  $_SGLOBAL['onlineip'] = getenv('HTTP_X_FORWARDED_FOR');

  } elseif(getenv('REMOTE_ADDR') && strcasecmp(getenv('REMOTE_ADDR'), 'unknown')) {

  $_SGLOBAL['onlineip'] = getenv('REMOTE_ADDR');

  } elseif(isset($_SERVER['REMOTE_ADDR']) && $_SERVER['REMOTE_ADDR'] && strcasecmp($_SERVER['REMOTE_ADDR'], 'unknown')) {

  $_SGLOBAL['onlineip'] = $_SERVER['REMOTE_ADDR'];

  }

  替换成

  function get_real_ip()

  {

  $ip=false;

  if(!empty($_SERVER["HTTP_CLIENT_IP"]))

  {

  $ip = $_SERVER["HTTP_CLIENT_IP"];

  }

  if (!empty($_SERVER['HTTP_X_FORWARDED_FOR']))

  {

  $ips = explode (", ", $_SERVER['HTTP_X_FORWARDED_FOR']);

  if ($ip)

  {

  array_unshift($ips, $ip); $ip = FALSE;

  }

  for ($i = 0; $i < count($ips); $i++)

  {

  if(!preg_match("/^(10|172\.16|192\.168)\./", $ $ips[$i])){

  $ip = $ips[$i];

  break;

  }

  }

  }

  return ($ip ? $ip : $_SERVER['REMOTE_ADDR']);

  }

  $_SGLOBAL['onlineip'] = get_real_ip();

  Discuz!使用CDN后获取真实IP办法

  nclude/common.inc.php

  找到如下代码:

  if(getenv('HTTP_CLIENT_IP') && strcasecmp(getenv('HTTP_CLIENT_IP'), 'unknown')) {

  $onlineip = getenv('HTTP_CLIENT_IP');

  } elseif(getenv('HTTP_X_FORWARDED_FOR') && strcasecmp(getenv('HTTP_X_FORWARDED_FOR'), 'unknown')) {

  $onlineip = getenv('HTTP_X_FORWARDED_FOR');

  } elseif(getenv('REMOTE_ADDR') && strcasecmp(getenv('REMOTE_ADDR'), 'unknown')) {

  $onlineip = getenv('REMOTE_ADDR');

  } elseif(isset($_SERVER['REMOTE_ADDR']) && $_SERVER['REMOTE_ADDR'] && strcasecmp($_SERVER['REMOTE_ADDR'], 'unknown')) {

  $onlineip = $_SERVER['REMOTE_ADDR'];

  }

  替换为:

  function get_real_ip()

  {

  $ip=false;

  if(!empty($_SERVER["HTTP_CLIENT_IP"]))

  {

  $ip = $_SERVER["HTTP_CLIENT_IP"];

  }

  if (!empty($_SERVER['HTTP_X_FORWARDED_FOR']))

  {

  $ips = explode (", ", $_SERVER['HTTP_X_FORWARDED_FOR']);

  if ($ip)

  {

  array_unshift($ips, $ip); $ip = FALSE;

  }

  for ($i = 0; $i < count($ips); $i++)

  {

  if(!preg_match("/^(10|172\.16|192\.168)\./", $ $ips[$i]))

  {

  $ip = $ips[$i];

  break;

  }

  }

  }

  return ($ip ? $ip : $_SERVER['REMOTE_ADDR']);

  }

  $onlineip = get_real_ip();

  帝国cms后台记录的ip日志和用户注册记录的ip

  \e\class\connect.php搜索function egetip()函数中的获取ip代码修改成以上部分

  DZ注册用户IP和邀请码拥有者IP相同的解决办法

  方法A:

  register.php 200行

  showmessage('register_invite_iperror');

  改为

  //showmessage('register_invite_iperror');

  方法B:

  在include/common.inc.php文件中把

  代码:

  if(getenv('HTTP_CLIENT_IP') && strcasecmp(getenv('HTTP_CLIENT_IP'), 'unknown')) {

  $onlineip = getenv('HTTP_CLIENT_IP');

  } elseif(getenv('HTTP_X_FORWARDED_FOR') && strcasecmp(getenv('HTTP_X_FORWARDED_FOR'), 'unknown')) {

  $onlineip = getenv('HTTP_X_FORWARDED_FOR');

  } elseif(getenv('REMOTE_ADDR') && strcasecmp(getenv('REMOTE_ADDR'), 'unknown')) {

  $onlineip = getenv('REMOTE_ADDR');

  } elseif(isset($_SERVER['REMOTE_ADDR']) && $_SERVER['REMOTE_ADDR'] && strcasecmp($_SERVER['REMOTE_ADDR'], 'unknown')) {

  $onlineip = $_SERVER['REMOTE_ADDR'];

  }

  替换成:

  代码:

  $onlineip=getenv('HTTP_X_FORWARD_FOR');

  --------------------

  做了CDN的ASP网站如何取到用户真实IP程序

  function checkip(checkstring)'用正则判断IP是否合法

  dim re1

  set re1=new RegExp

  re1.pattern="^[0-9]{1,3}.[0-9]{1,3}.[0-9]{1,3}.[0-9]{1,3}$"

  re1.global=false

  re1.Ignorecase=false

  checkip=re1.test(checkstring)

  set re1=nothing

  end function

  function get_cli_ip()'取真实IP函数,先 HTTP_CLIENT_IP 再 HTTP_X_FORWARDED_FOR 再 REMOTE_ADDR

  dim client_ip

  if checkip(Request.ServerVariables("HTTP_CLIENT_IP"))=true then

  get_cli_ip = checkip(Request.ServerVariables("HTTP_CLIENT_IP"))

  else

  MyArray = split(Request.ServerVariables("HTTP_X_FORWARDED_FOR"),",")

  if ubound(MyArray)>=0 then

  client_ip = trim(MyArray(0))

  if checkip(client_ip)=true then

  get_cli_ip = client_ip

  exit function

  end if

  end if

  get_cli_ip = Request.ServerVariables("REMOTE_ADDR")

  end if

  end function

  ASP.NET获取IP的6种方法

  服务端:

  

//方法一
HttpContext.Current.Request.UserHostAddress;
//方法二
HttpContext.Current.Request.ServerVariables["REMOTE_ADDR"];
//方法三
string strHostName = System.Net.Dns.GetHostName();
string clientIPAddress = System.Net.Dns.GetHostAddresses(strHostName).GetValue(0).ToString();
//方法四(无视代理)
HttpContext.Current.Request.ServerVariables["HTTP_X_FORWARDED_FOR"];

  客户端:

//方法五
var ip = '';
alert("Your IP address is "+ip);
//方法六(无视代理)
function GetLocalIPAddress()

  {

  var obj = null;

  var rslt = "";

  try

  {

  obj = new ActiveXObject("rcbdyctl.Setting");

  rslt = obj.GetIPAddress;

  obj = null;

  }

  catch(e)

  {

  //

  }

  return rslt;

  }

  来自印度的MCT Maulik Patel提供了一种服务端的解决方案,很好:

  

if(Context.Request.ServerVariables["HTTP_VIA"]!=null) // using proxy

  {

  ip=Context.Request.ServerVariables["HTTP_X_FORWARDED_FOR"].ToString(); // Return real client IP.

  }

  

else// not using proxy or can't get the Client IP

  {

  ip=Context.Request.ServerVariables["REMOTE_ADDR"].ToString(); //While it can't get the Client IP, it will return proxy IP.

  }

  

  备注:

  1. 有些代理是不会发给我们真实IP地址的

  2. 有些客户端会因为“header_access deny”的安全设置而不发给我们IP




来源:
阅读:452
日期:2023-02-28

【 双击滚屏 】 【 推荐朋友 】 【 收藏 】 【 打印 】 【 关闭 】 【 字体: 】 
上一篇:西部数码免费虚拟主机
下一篇:西部数码弹性云主机重装后找回D盘(适用windows系统)
  >> 相关文章