今天登录九秒社团 http://www.9miao.com/的时候忘记了用户名和密码,尝试了5次都没登录成功,网站弹出提示15分钟后才能再次登录。我纳闷它是怎么判断用户的登录次数,这时候用户还没有登录成功,获取不到userid的,那么也就是后台也不知道“登录者到底是谁”?(清除localStorage后,也还是提示15分钟后登录,当然我没有清cookie,九秒网站也不会这么做)。我所能想到的只有是通过ip来确定登录者的登录次数了,然后就想用代理服务器来蒙混过关,就有了下面的实验。

九秒是能够透过透明服务器获取用户ip的,所以要用匿名/高匿代理服务器才能跳过"15分钟后再登录"的关卡,事实也证明了这一点。

经过测试发现:九秒不全是通过ip来确定用户的,还通过用户名来确定用户(如果用户名存在的话)

程序代码

 <?php
//真实ip
function getip() {
$unknown = 'unknown';
if (isset($_SERVER['HTTP_X_FORWARDED_FOR']) && $_SERVER['HTTP_X_FORWARDED_FOR'] && strcasecmp($_SERVER['HTTP_X_FORWARDED_FOR'], $unknown)) {
$ip = $_SERVER['HTTP_X_FORWARDED_FOR'];
}
elseif(isset($_SERVER['REMOTE_ADDR']) && $_SERVER['REMOTE_ADDR'] && strcasecmp($_SERVER['REMOTE_ADDR'], $unknown)) {
$ip = $_SERVER['REMOTE_ADDR'];
}
/**
处理多层代理的情况
或者使用正则方式:$ip = preg_match("/[\d\.]{7,15}/", $ip, $matches) ? $matches[0] : $unknown;
***/
if (false !== strpos($ip, ',')){ $ip = reset(explode(',', $ip)); }
return $ip;
}
echo getip();
?>

实验1:没有使用代理服务器情况下
  http://ip.chinaz.com/ 的显示结果是 【您来自:219.147.15.232 所在区域:山东省青岛市 电信】
  http://ip.cn/ 的显示结果是 【当前 IP:219.147.15.232 来自:山东省青岛市 电信】
  http://www.ip138.com/ 的显示结果是 【本机IP: 219.147.15.232山东省青岛市 电信】
  程序代码显示结果是 219.147.15.232

  结论:程序代码正确获得了用户主机ip

实验2:使用 36.250.69.4:80 透明代理服务器的情况下
  http://ip.chinaz.com/ 的显示结果是 【您来自:219.147.15.232 所在区域:山东省青岛市 电信】
  http://ip.cn/ 的显示结果是 【当前 IP:36.250.69.4 来自:福建省厦门市 联通】
  http://www.ip138.com/ 的显示结果是 【您的IP是:[36.250.69.4] 来自:福建省厦门市 联通】
  程序代码显示结果是 219.147.15.232

  结论:程序代码能透过透明代理服务器获取到用户的真实ip(还是ip.chinaz.com比较专业一些)

实验3:使用 61.135.217.10:80 匿名代理服务器的情况下
  http://ip.chinaz.com/ 的显示结果是 【您来自:61.135.217.10 所在区域:北京市 联通互联网数据中心】
  http://ip.cn/ 的显示结果是 【当前 IP:61.135.217.10 来自:北京市 联通】
  http://www.ip138.com/ 的显示结果是 【您的IP是:[61.135.217.10] 来自:北京市北京市 联通】
  程序代码显示结果是 61.135.217.10

  结论:程序代码能不能透过匿名代理服务器获取到用户的真实ip

实验4:使用 1.69.186.141:8888 高匿代理服务器的情况下
  http://ip.chinaz.com/ 的显示结果是 【您来自:1.69.186.141 所在区域:山西省 G】
  http://ip.cn/ 的显示结果是 【当前 IP:1.69.186.141 来自:山西省运城市 电信】
  http://www.ip138.com/ 的显示结果是 【您的IP是:[1.69.186.141] 来自:山西省运城市 电信】
  程序代码显示结果是 1.69.186.141

  结论:程序代码能不能透过高匿代理服务器获取到用户的真实ip

总结:

在PHP获取客户端IP中常使用 $_SERVER["REMOTE_ADDR"] 。
(1) 但如果客户端是使用代理服务器来访问,那取到的是代理服务器的 IP 地址,而不是真正的客户端 IP 地址。要想透过代理服务器取得客户端的真实 IP 地址,就要使用 $_SERVER["HTTP_X_FORWARDED_FOR"] 来读取。
(2) 但只有客户端使用“透明代理”的情况下,$_SERVER["HTTP_X_FORWARDED_FOR"] 的值才是客户端真正的IP(如果是多层代理,该值可能是由客户端真正IP和多个代理服务器的IP组成,由逗号“,”分隔)。
(3) 而在“匿名代理”、“高匿名”的情况下是代理服务器的IP值(如果是多层代理,该值可能由多个代理服务器的IP组成,由逗号“,”分隔)。

扩展:

如果从隐藏使用代理用户的级别上划分,代理可以分为三种,即高度匿名代理、普通匿名代理和透明代理。 
(1)高度匿名代理不改变客户机的请求,这样在服务器看来就像有个真正的客户浏览器在访问它,这时客户的真实IP是隐藏的,服务器端不会认为我们使用了代理。 
(2)普通匿名代理能隐藏客户机的真实IP,但会改变我们的请求信息,服务器端有可能会认为我们使用了代理。不过使用此种代理时,虽然被访问的网站不能知道你的ip地址,但仍然可以知道你在使用代理,当然某些能够侦测ip的网页仍然可以查到你的ip。 
(3)透明代理,它不但改变了我们的请求信息,还会传送真实的IP地址。 
三者隐藏使用代理者身份的级别依次为高度匿名代理最隐蔽,其次是普通匿名代理,最差的是透明代理。

获取真实ip的报告的更多相关文章

  1. 阿里云SLB后Nginx、Tomcat获取真实IP

    一.SLB后Nginx如何获取真实IP 前提:nginx作为slb获取真实ip是使用 http_realip_module,默认一键安装包安装的nginx没有安装这个模块需要重新重新编译nginx并加 ...

  2. Nginx 获取真实 IP 方案

    问题根源: 基于七层的负载均衡系统,获取IP的原理都是通过XRI和XFF进行处理,从中选出“正常情况下”的源头IP,然而这两个Header都是普通的HTTP头,任何代理程序都可以轻易修改伪造它们,使得 ...

  3. nginx前端负载,后端apache获取真实IP设置

    原文链接: nginx前端负载,后端apache获取真实IP设置 参考文献: 前端Nginx,后端Apache获取用户真实IP地址  按照第二种方法设置不成功! 网站最前端是nginx,做的PROXY ...

  4. Nginx 反向代理获取真实IP问题

    一.前言 前文 Nginx 解决WebApi跨域二次请求以及Vue单页面问题 当中虽然解决了跨域问题带来的二次请求,但也产生了一个新的问题,就是如果需要获取用户IP的时候,获取的IP地址总是本机地址. ...

  5. 获取请求主机IP地址,如果通过代理进来,则透过防火墙获取真实IP地址;

    package com.utils; import org.slf4j.Logger; import org.slf4j.LoggerFactory; import javax.servlet.htt ...

  6. nodejs+nginx获取真实ip

    nodejs + nginx获取真实ip分为两部分: 第一.配置nginx: 第二.通过nodejs代码获取: 其他语言也是一样的,都是配置nginx之后,在http头里面获取“x-forwarded ...

  7. JSP 获取真实IP地址的代码

    [转载]JSP 获取真实IP地址的代码 JSP 获取真实IP地址的代码 在JSP里,获取客户端的IP地址的方法是:request.getRemoteAddr(),这种方法在大部分情况下都是有效的.   ...

  8. 003-Nginx 设置Header 获取真实IP

    1.X-Forwarded-For的定义: X-Forwarded-For:简称XFF头,它代表客户端,也就是HTTP的请求端真实的IP,只有在通过了HTTP 代理或者负载均衡服务器时才会添加该项.它 ...

  9. 【转载】JSP 获取真实IP地址的代码

    JSP 获取真实IP地址的代码 在JSP里,获取客户端的IP地址的方法是:request.getRemoteAddr(),这种方法在大部分情况下都是有效的.   但是在通过了 Apache,Squid ...

随机推荐

  1. 浅析 Java Thread.join()

    转自:http://blog.csdn.net/bzwm/article/details/3881392 一.在研究join的用法之前,先明确两件事情. 1.join方法定义在Thread类中,则调用 ...

  2. 【HTML5】Application Cache应用程序缓存

    HTML5 引入了应用程序缓存,这意味着 web 应用可进行缓存,并可在没有因特网连接时进行访问. 应用程序缓存为应用带来三个优势: 离线浏览 - 用户可在应用离线时使用它们 速度 - 已缓存资源加载 ...

  3. CDH中,如果管理CM中没有的属性

    在CM配置管理中的"hive-site.xml 的 Hive 客户端高级配置代码段(安全阀)""仅适用于高级使用,逐个将字符串插入 hive-site.xml 的客户端配 ...

  4. JIT晚期(运行期)

    在部分的商用虚拟机(Sun HotSpot.IBM J9)中,Java程序最初是通过解释器(Interpreter)进行解释执行的,当虚拟机发现某个方法或代码块的运行特别频繁时,就会把这些代码认定为& ...

  5. JS插件

    1.Placeholders.js 所有的浏览器都支持placeholder,唯独IE不支持.现在我们有了这款插件,IE下终于可以支持了! 2.Html5shiv.js 主要解决HTML5提出的新的元 ...

  6. 简单几何(判断矩形的位置) UVALive 7070 The E-pang Palace(14广州B)

    题目传送门 题意:给了一些点,问组成两个不相交的矩形的面积和最大 分析:暴力枚举,先找出可以组成矩形的两点并保存起来(vis数组很好),然后写个函数判断四个点是否在另一个矩形内部.当时没有保存矩形,用 ...

  7. POJ2817 WordStack(状压DP)

    题目给几个字符串,可以给它们添加前导空格,然后排列,计算每一个字符串和前一个字符串相同非空格字符相等的个数,求可能的最大个数. 状态DP: d[S][i][j]表示已经用的字符串集合S且排列的最后一个 ...

  8. Converting Stream to String and back…what are we missing?

    string test = "Testing 1-2-3"; // convert string to stream byte[] byteArray = Encoding.ASC ...

  9. BZOJ4230: 倒计时

    4230: 倒计时 Time Limit: 10 Sec  Memory Limit: 256 MBSubmit: 20  Solved: 12[Submit][Status][Discuss] De ...

  10. Graph database_neo4j 底层存储结构分析(7)

    3.7  Relationship 的存储 下面是neo4j graph db 中,Relationship数据存储对应的文件: neostore.relationshipgroupstore.db ...