HttpClient使用之下载远程服务器中的文件(注意目录遍历漏洞)

参考文献:

http://bbs.csdn.net/topics/390952011

http://blog.csdn.net/ljj_9/article/details/53306468

1.下载地址

http://hc.apache.org/downloads.cgi

Apache-》Projects-》HttpComponents

2.DownloadServlet

 1 package com.servlet;
 2 
 3 import java.io.BufferedInputStream;
 4 import java.io.BufferedOutputStream;
 5 import java.io.File;
 6 import java.io.FileInputStream;
 7 import java.io.IOException;
 8 import java.io.InputStream;
 9 import java.io.OutputStream;
10 import java.net.URLDecoder;
11 import java.net.URLEncoder;
12 
13 import javax.servlet.ServletException;
14 import javax.servlet.http.HttpServlet;
15 import javax.servlet.http.HttpServletRequest;
16 import javax.servlet.http.HttpServletResponse;
17 
18 
19 
20 public class DownloadServlet extends HttpServlet {
21 
22     private static final long serialVersionUID = 1L;
23     
24     public void doGet(HttpServletRequest request, HttpServletResponse response)
25             throws ServletException, IOException {
26         String filename = request.getParameter("id");
27         String fileUrl = request.getServletContext().getRealPath("").replace("\\", "/"); 
28         fileUrl = fileUrl + "/files/document/" + filename;
29         System.out.println("fileUrl:"+fileUrl);
30         String rname = new String(filename.getBytes("utf-8"));
31         System.out.println("begin:"+rname);
32         rname = URLEncoder.encode(rname);
33         System.out.println("end:"+rname);
34         response.addHeader("Content-Disposition", "attachment;filename="+rname);
35         response.setContentType("application/octet-stream");
36         
37         File file = new File(fileUrl);
38         InputStream is = new BufferedInputStream(new FileInputStream(file));
39         byte[] buffer = new byte[is.available()];
40         is.read(buffer);
41         is.close();
42          
43         OutputStream os = new BufferedOutputStream(response.getOutputStream());
44         os.write(buffer);
45         os.flush();
46         os.close();
47     }
48     
49     
50     public void doPost(HttpServletRequest request, HttpServletResponse response)
51             throws ServletException, IOException {
52         
53         
54     }
55     
56     
57     }
58     
59   

3.ClientA.java

 

package com.tool;

import java.io.File;
import java.io.FileOutputStream;
import java.io.IOException;
import java.io.InputStream;
import java.io.OutputStream;

import org.apache.http.HttpResponse;
import org.apache.http.client.ClientProtocolException;
import org.apache.http.client.HttpClient;
import org.apache.http.client.methods.HttpGet;
import org.apache.http.impl.client.DefaultHttpClient;

public class ClientA {

    /**
     * 
     * @param args
     */
    
    public static void main(String[] args) {
        // TODO 自动生成的方法存根
        ClientA client = new ClientA();
        client.service();
    }

    public void service() {
        // TODO 自动生成的方法存根
        
        String url = "http://此处填写ip或网址/download.do";
        
        HttpClient client = new DefaultHttpClient();
        HttpGet get = new HttpGet(url);
         
        try {
             
            HttpResponse response = client.execute(get);
           
        } catch (ClientProtocolException e) {
            // TODO Auto-generated catch block
            e.printStackTrace();
        } catch (IOException e) {
            // TODO Auto-generated catch block
            e.printStackTrace();
        }
    }

}

4.注意服务器的编码方式和客户端的区别

统一为utf-8

5.注意目录遍历漏洞

目录遍历是通过操作URL强行访问web目录以外的文件,目录和命令,攻击者可以在目标机器的任何位置访问文件,执行命令。 
最基本的目录遍历攻击技术是在URL中使用"../"序列,改变访问资源的路径,访问到web目录以外的文件。 
例如: 
http://example.com/../../../../some/file 
http://example.com/..%255c..%255c/some/file 
正常请求为: 
http://example.com/test.cgi?look=intex.html 
如果存在目录遍历漏洞,攻击者可以访问 
http://example.com/test.cgi?look=test.cgi

解决办法:

过滤请求数据中"../"字符序列及其各种变形。 
验证用户请求中提交的需要访问的文件是否在限定的范围内。

java web使用fliter过滤url即可。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值