搭建WEB服务
创建一个web工程,编写一个简单的servlet获取客户端ip
protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
String clientIp = null;
clientIp = request.getHeader("X-Forwarded-For");
if(clientIp == null || clientIp.length() == 0 || "unknown".equalsIgnoreCase(clientIp)){
clientIp = request.getHeader("Proxy-Client-IP");
}
if(clientIp == null || clientIp.length() == 0 || "unknown".equalsIgnoreCase(clientIp)){
clientIp = request.getHeader("WL-Proxy-Client-IP");
}
if(clientIp == null || clientIp.length() == 0 || "unknown".equalsIgnoreCase(clientIp)){
clientIp = request.getHeader("HTTP_CLIENT_IP");
}
if(clientIp == null || clientIp.length() == 0 || "unknown".equalsIgnoreCase(clientIp)){
clientIp = request.getRemoteAddr();
if (clientIp.equals("127.0.0.1")) {
InetAddress inet = null;
try {
inet = InetAddress.getLocalHost();
} catch (UnknownHostException e) {
e.printStackTrace();
}
clientIp = inet.getHostAddress();
}
}
//如果有多层代理,第一个ip为真实客户端ip
if (clientIp != null && clientIp.length() > 15) {
if (clientIp.indexOf(",") > 0) {
clientIp = clientIp.substring(0, clientIp.indexOf(","));
}
}
logger.info("clientIp = "+clientIp);
}
关于请求头中X-FORWARDED-FOR、Proxy-Client-IP、WL-Proxy-Client-IP、HTTP_CLIENT_IP信息的含义
这篇博客写的很详细。
先来测试下这段代码,浏览器请求http://localhost:8080/IPTest/GetIP,看下log4j控制台打印的日志信息
获取到的是本机真实的IP
伪造IP
方式一:浏览器插件
以火狐为例,添加一个附加组件Modify Headers,使用它可以更改请求头,达成伪造IP的目的
修改方法很简单,选择Header->Select action->Modify,在Header name输入框输入X-Forwarded-For,Header value输入框输入要伪造的IP,比如212.66.66.123,完了点击Add添加。
然后点击Start按钮启动插件,再次在访问WEB服务,查看控制台日志,可见IP伪造成功
修改请求头的插件有很多,比如Google浏览器的ModHeader等等。很多网站通过User-Agent头信息来判断用户是通过web还是wap请求来做版本适配的,这些插件的另一种经常用途就是通过修改User-Agent头信息,方便开发人员在PC上做版本适配的开发。
方式二:CURL
这是通过PHP脚本实现的,代码如下
<?php
function fakeIP(){
$url = "http://localhost:8080/IPTest/GetIP";
$ip = "100.100.".rand(0,255).".".rand(0,255);//随机生成IP
echo $ip;
$headers = array("X-FORWARDED-FOR:$ip");
$curl = curl_init($url);
curl_setopt($curl,CURLOPT_HTTPHEADER,$headers);//伪造IP
//curl_setopt($curl, CURLOPT_RETURNTRANSFER, 1);
curl_setopt($curl, CURLOPT_USERAGENT, "Mozilla/5.0");
$src = curl_exec($curl);
curl_close($curl);
}
fakeIP();
?>
执行时遇到了以下错误
原因是动态链接库未找到,将php.ini文件(php安装目录下)中将extension=php_curl.dll注释去掉即可,具体可以参考
这篇博客
再运行一遍
查看控制台日志
关于PHP cURL的具体用法可以参见
PHP官网