使用HTTP_X_FORWARDED_FOR获取客户端IP的严重后果
在WEB开发中.我们可能都习惯使用下面的代码来获取客户端的IP地址:
C#代码
//优先取得代理IP string IP = Request.ServerVariables["HTTP_X_FORWARDED_FOR"]; if (string.IsNullOrEmpty(IP)) { //没有代理IP则直接取连接客户端IP IP = Request.ServerVariables["REMOTE_ADDR"]; }
上面代码看来起是正常的.可惜这里却隐藏了一个隐患!!因为"HTTP_X_FORWARDED_FOR"这个值是通过获取HTTP头的"X_FORWARDED_FOR"属性取得.所以这里就提供给恶意破坏者一个办法:可以伪造IP地址!!
下面是测试代码:
C#代码
HttpWebRequest request = (HttpWebRequest)HttpWebRequest.Create("http://localhost/ip.aspx"); request.Headers.Add("X_FORWARDED_FOR", "0.0.0.0"); HttpWebResponse response = (HttpWebResponse)request.GetResponse(); StreamReader stream = new StreamReader(response.GetResponseStream()); string IP = stream.ReadToEnd(); stream.Close(); response.Close(); request = null;
"ip.aspx"文件代码:
C#代码
Response.Clear(); //优先取得代理IP string IP = Request.ServerVariables["HTTP_X_FORWARDED_FOR"]; if (string.IsNullOrEmpty(IP)) { //没有代理IP则直接取客户端IP IP = Request.ServerVariables["REMOTE_ADDR"]; } Response.Write(IP); Response.End();
这样.当测试代码中去访问ip.aspx文件时."string IP = stream.ReadToEnd();"这段代码取到的IP数据就是"0.0.0.0"!!!!(呵.在真实情况下.这样的IP地址肯定不是我们想要的结果.而在有些投票系统中限制一个IP只能投1次票时,如果也是用类似的代码取得对方IP然后再判断的话.呵呵.限制就失效咯)...
或者如果你用上面代码获取IP地址后后面又不再进行数据判断的话也许还能更进一步进行数据破坏!!
比如你用类似上面的代码中获取IP地址就直接有这样的SQL语句:
string sql = "INSERT INTO (IP) VALUE ('" + IP + "')";
那么也许破坏者还可以进行SQL注入进行数据破坏!!