获取用户Ip地址通用方法

这个来自一些项目中,获取用户Ip,进行用户操作行为的记录,是常见并且经常使用的。 一般朋友,都会看到如下通用获取IP地址方法。

 1     public static function getIp()
 2     {
 3         if ($HTTP_SERVER_VARS["HTTP_X_FORWARDED_FOR"])
 4         {
 5             $ip = $HTTP_SERVER_VARS["HTTP_X_FORWARDED_FOR"];
 6         }
 7         elseif ($HTTP_SERVER_VARS["HTTP_CLIENT_IP"])
 8         {
 9             $ip = $HTTP_SERVER_VARS["HTTP_CLIENT_IP"];
10         }
11         elseif ($HTTP_SERVER_VARS["REMOTE_ADDR"])
12         {
13             $ip = $HTTP_SERVER_VARS["REMOTE_ADDR"];
14         }
15         elseif (getenv("HTTP_X_FORWARDED_FOR"))
16         {
17             $ip = getenv("HTTP_X_FORWARDED_FOR");
18         }
19         elseif (getenv("HTTP_CLIENT_IP"))
20         {
21             $ip = getenv("HTTP_CLIENT_IP");
22         }
23         elseif (getenv("REMOTE_ADDR"))
24         {
25             $ip = getenv("REMOTE_ADDR");
26         }
27         else
28         {
29             $ip = "Unknown";
30         }
31         if(strpos($ip, ‘,‘) !== false){
32             $ip = explode(‘,‘, $ip);
33             $ip = reset($ip);
34         }
35         return $ip;
36     }
37     
  • IP获取来源

1.’REMOTE_ADDR’  是远端IP,默认来自tcp 连接是,客户端的Ip。可以说,它最准确,确定是,只会得到直接连服务器客户端IP。如果对方通过代理服务器上网,就发现。获取到的是代理服务器IP了。

如:a->b(proxy)->c  ,如果c 通过’REMOTE_ADDR’ ,只能获取到b的IP,获取不到a的IP了。

另外:该IP想篡改将很难实现,在传递知道生成php server值,都是直接生成的。

2.’HTTP_X_FORWARDED_FOR’,’HTTP_CLIENT_IP’ 为了能在大型网络中,获取到最原始用户IP,或者代理IP地址。对HTTp协议进行扩展。定义了实体头。

  • 结论:

上面getip函数,除了客户端可以任意伪造IP,并且可以传入任意格式IP。 这样结果会带来2大问题,其一,如果你设置某个页面,做IP限制。 对方可以容易修改IP不断请求该页面。 其二,这类数据你如果直接使用,将带来SQL注册,跨站攻击等漏洞。至于其一,可以在业务上面做限制,最好不采用IP限制。 对于其二,这类可以带来巨大网络风险。我们必须加以纠正。

需要对getip 进行修改,得到安全的getip函数。

这类问题,其实很容易出现,以前我就利用这个骗取了大量伪装投票。有它的隐蔽性,其实只要我们搞清楚了,某些值来龙去脉的话。理解了它的原理,修复该类bug将是非常容易。

题外话,做技术,有三步,先要会做,会解决;后要思考为什么要这么做,原因原理是什么;最后是怎么样做,有没有其它方法。多问问自己,你发现距离技术真理越来越近。你做事会越来越得心应手的!

时间: 2024-10-13 06:10:07

获取用户Ip地址通用方法的相关文章

Flask框架获取用户IP地址的方法

本文实例讲述了python使用Flask框架获取用户IP地址的方法.分享给大家供大家参考.具体如下: 下面的代码包含了html页面和python代码,非常详细,如果你正使用Flask,也可以学习一下最基本的Flask使用方法. python代码如下: from flask import Flask, render_template, request # Initialize the Flask application app = Flask(__name__) # Default route,

C#获取真实IP地址实现方法

通常来说,大家获取用户IP地址常用的方法是: 1 string IpAddress = ""; 2 if((HttpContext.Current.Request.ServerVariables["HTTP_X_FORWARDED_FOR"]!=null 3 && HttpContext.Current.Request.ServerVariables["HTTP_X_FORWARDED_FOR"] !=String.Empty)

C# 获取用户IP地址(转载)

[ASP.NET开发]获取客户端IP地址 via C# 说明:本文中的内容是我综合博客园上的博文和MSDN讨论区的资料,再通过自己的实际测试而得来,属于自己原创的内容说实话很少,写这一篇是为了记录自己在项目中做过的事情,同时也想抛砖引玉.参考的博文及其作者在下文均有提及.待到自己以后对HTTP.TCP/IP等知识学深入了,一定再来这里深入讨论这个内容. 一.名词 首先说一下接下来要讲到的一些名词. 在Web开发中,我们大多都习惯使用HTTP请求头中的某些属性来获取客户端的IP地址,常见的属性是R

【用jQuery来判断浏览器的类型】及【javascript获取用户ip地址】

用jQuery来判断浏览器的类型,主要是使用$.browser这个工具类,使用方法: $.browser.['浏览器关键字'] //谷歌浏览器.360浏览器等其他一些浏览器,没有专门的判断 function appInfo() { var bro = $.browser; var binfo = ""; if (bro.msie) { binfo = "Microsoft Internet Explorer " + bro.version; // bro.versi

用户登录时,获取用户ip地址

使用django来获取用户访问的IP地址,如果用户是正常情况下通过request.META['REMOTE_ADDR']  可以获得用户的IP地址.但是有些网站服务器会使用ngix等代理http,或者是该网站做了负载均衡,导致使用remote_addr抓取到的是1270.0.1,这时使用HTTP_X_FORWARDED_FOR才获得是用户的真实IP. 推荐使用以下代码 if request.META.has_key('HTTP_X_FORWARDED_FOR'): ip = request.ME

Oracle记录连接用户IP地址的方法

我们都知道在v$session中记录着客户端的机器名称,但是没有IP,那我们如何让v$session中也记录IP的信息呢? 1.首先,利用 DBMS_SESSION 过程包,先执行: BEGIN DBMS_SESSION.set_identifier(SYS_CONTEXT('USERENV', 'IP_ADDRESS')); END; / 2.执行触发器 create or replace trigger on_logon_trigger after logon ondatabase begi

获取用户IP地址

// <summary> /// 取得客户端真实IP.如果有代理则取第一个非内网地址 /// by flower.b /// </summary> public static string IPAddress { get { string result = String.Empty; result = HttpContext.Current.Request.ServerVariables["HTTP_X_FORWARDED_FOR"]; if (result !

Haproxy配置支持https获取用户IP地址

global log 127.0.0.1 local0 chroot /var/lib/haproxy #chroot运行路径 pidfile /var/run/haproxy.pid #haproxy 进程PID文件 maxconn 65535 #默认最大连接数,需考虑ulimit-n限制 user haproxy group haproxy daemon #以后台形式运行harpoxy tune.ssl.default-dh-param 2048 ssl-server-verify none

获取用户ip地址,为什么获取不到代理过之后的

<%@ page language="java" contentType="text/html; charset=UTF-8"     pageEncoding="UTF-8" import="org.apache.commons.lang3.StringUtils;"%> <!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN&q