WEB程序获取客户端IP的做法及其安全隐患

WEB程序获取客户端IP的方法有两种,一种是直接获取访问来源的IP,另一种是通过HTTP头中带的IP信息来获取。

前者获取的IP是直接接触的IP,既获取的永远都是最后一环的IP,如果用户使用了代理,就获取不到用户真实IP了。

后者获取的IP是“代理服务器”在HTTP头加上的信息,帮助识别或者标记IP路径,或者客户端的原始IP,但是HTTP头的信息是可控的,也就是说可伪造。

以PHP为例,PHP可以通过$_SERVER和getenv获取常量IP如下:

  $_SERVER[‘REMOTE_ADDR‘];

  $_SERVER[‘HTTP_CLIENT_IP‘];

  $_SERVER[‘HTTP_X_FORWARDED_FOR‘];

  getenv("HTTP_X_FORWARDED_FOR");

  getenv("HTTP_CLIENT_IP");

  getenv("REMOTE_ADDR");

其中 REMOTE_ADDR 就是上面提到的情况1,HTTP_CLIENT_IP 和 HTTP_X_FORWARDED_FOR 就是情况二。

对于一个完整的获取IP的功能来说,较为合理的是获取 HTTP_X_FORWARDED_FOR 和 HTTP_CLIENT_IP 等代理服务器标识的IP,若不存在则获取直接相连的 REMOTE_ADDR 。

但是这样做的安全隐患就是:X_FORWARDED_FOR 等信息是HTTP头中的字段,可以被修改(伪造)为任意字符串。假设一个业务情景是:将用户的IP存入数据库内,若先获取到了用户伪造的IP字符串,注入了SQL查询语句,造成了 SQL Inject 漏洞。

所以要么直接获取REMOTE_ADDR,要么对 HTTP_X_FORWARDED_FOR 等进行过滤(比如按格式来过滤,或者用正则来刨除除了‘点‘和‘数字‘以外其他字符)

时间: 2024-11-08 09:59:02

WEB程序获取客户端IP的做法及其安全隐患的相关文章

Netty4.X 获取客户端IP

最近使用netty-4.0.23.Final 版本编写服务端代码,有个获取客户端代码的小需求,以前使用servlet开发时很机械的就: String ipAddr="0.0.0.0"; if (reqest.getHeader("X-Forwarded-For") == null) {     ipAddr = reqest.getRemoteAddr();  }else{          ipAddr = req.getHeader("X-Forwar

ASP.NET获取客户端信息,获取客户端IP等等

山上明月 ASP.NET能知道的东西 获取服务器电脑名: Page.Server.ManchineName 获取用户信息: Page.User 获取客户端电脑名:Page.Request.UserHostName 获取客户端电脑IP: Page.Request.UserHostAddress 1. 在ASP.NET中专用属性: 获取服务器电脑名:Page.Server.ManchineName 获取用户信息:Page.User 获取客户端电脑名:Page.Request.UserHostName

asp.net获取客户端IP方法(转载)

最近web获取客户端ip,看到下面这篇文章,转载过来,一起分享(转载地址:http://www.cnblogs.com/yejun/archive/2008/02/26/1082485.html) 通常我们都通过下面的代码获得IP: string ip =System.Web.HttpContext.Current.Request.UserHostAddress; 或 string ip =System.Web.HttpContext.Current.Request.ServerVariable

性能优化之——.NET(C#)调用webService获取客户端IP地址所属区域(异步回调)(二)

朋友们这次分享的是异步回调不是异步调用哦! 请注意喽! 功能描述,接口地址,方法名称以及参数说明,同上篇:.NET(C#)调用webService获取客户端IP地址所属区域(非异步)(一)(LZ比较懒,不想写太多哦!(⊙0⊙)) 实现代码如下: 1 namespace main 2 { 3 class Program 4 { 5 public static string Result = string.Empty; 6 7 static void Main(string[] args) 8 {

.net 获取客户端Ip地址

Request.ServerVariables["REMOTE_ADDR"]来取得客户端的IP地址,但如果客户端是使用代理服务器来访问,那取到的就是代理服务器的IP地址,而不是真正的客户端IP地址. 要想透过代理服务器取得客户端的真实IP地址,就要使用 Request.ServerVariables["HTTP_X_FORWARDED_FOR"]来读取. 不过要注意的事,并不是每个代理服务器都能用 Request.ServerVariables["HTTP

C#服务器获取客户端IP地址以及归属地探秘

背景:博主本是一位Windows桌面应用程序开发工程师,对网络通信一知半解.一日老婆逛完某宝,问:"为什么他们知道我的地址呢,他们是怎么获取我的地址的呢?" 顺着这个问题我们的探秘开始: 第一步:简单的服务搭建 思路,通过HttpListener在本地搭建一个简易的服务器,开发程序为控制台接口,核心类 HttpListenerService: 方法 Start()开启线程池针对指定IP进行监听,本地的端口选取的9527(周星驰唐伯虎点秋香在华府的编号)  public void Sta

.Net Web Api——获取客户端浏览器信息

第一次接触到web api,发现这个东西是REST风格的:---- 微软的web api是在vs2012上的mvc4项目绑定发行的,它提出的web api是完全基于RESTful标准的,完全不同于之前的(同是SOAP协议的)wcf和webService,它是简单,代码可读性强的,上手快的,如果要拿它和web服务相比,我会说,它的接口更标准,更清晰,没有混乱的方法名称,有的只有几种标准的请求,如get,post,put,delete等,它们分别对应的几个操作,下面讲一下: GET:生到数据列表(默

获取客户端IP地址 via C#

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

.Net一个很有用的帮助类,包含获取获取浏览器版本号、 获取操作系统版本号、获取客户端IP地址、取客户端真实IP、获取公网IP、判断是否是IP格式

using System;using System.Collections.Generic;using System.Linq;using System.Text;using System.Text.RegularExpressions;using System.Threading.Tasks;using System.Web; namespace ZC.Common.Log{    class UserHelper    { #region 获取浏览器版本号 /// <summary>