码迷,mamicode.com
首页 > Web开发 > 详细

文件上传漏洞原理以及防范

时间:2015-10-20 19:31:39      阅读:830      评论:0      收藏:0      [点我收藏+]

标签:

1. 什么是文件上传漏洞

  程序员由于没有对上传的文件进行严格限定,导致黑客可以通过工具上传其他格式的程序文件(比如:webshell),这样黑客就会拿到一个可执行环境,在服务器上搞破坏。

一个常见的例子,很多网站存在上传图片的功能,如果不对上传图片的扩展名进行检测、过滤就会造成上传漏洞。  

2. 如何防范上传漏洞

  步骤:前端JS代码限定--->后台代码检测--->取消文件目录执行脚本的权限。

以如何防范图片上传漏洞做个过程分析:

新建一个解决方案:  

                           技术分享

2.1 第一步前端用JavaScript对上传文件的扩展名进行判定,不符合格式的文件禁止上传。但是用户可通过禁用或修改JS代码依然可以上传各种类型的文件,所以JS在这的功能也只是辅助用户正确选择文件。 

前端代码:

 1 <!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
 2 <html xmlns="http://www.w3.org/1999/xhtml">
 3 <head>
 4     <title></title>
 5     <script type="text/javascript">
 6         function showImgPath() {
 7             var fileName = document.getElementById("fileImg").value;
 8             var ext = fileName.substr(fileName.lastIndexOf(.));
 9             if (ext == ".jpeg" || ext == ".jpg" || ext == ".png" || ext == ".gif") {
10                 return true;
11             }
12             else {
13                 alert("请选择.jpeg/.jpg/.png/.gif/格式图片");
14             }
15         }
16     </script>
17 </head>
18 <body>
19     <form method="post" enctype="multipart/form-data" action="FileUploadHandler.ashx">
20         <input type="file" name="image" id="fileImg" onchange="showImgPath()" />
21         <input type="submit" value="提交" />
22     </form>
23 </body>
24 </html>

 

2.2 第二步就是后台接收到前端传来的图片文件后,做类似前端的代码处理过程,同样是对文件扩展名进行检测。格式如果不符合要求就结束此次请求,相反就把图片保存到存储目录中。

后台代码:

 1     public class FileUploadHandler : IHttpHandler
 2     {
 3 
 4         public void ProcessRequest(HttpContext context)
 5         {
 6             context.Response.ContentType = "text/html";
 7             //获取表单上传的文件
 8             HttpPostedFile file= context.Request.Files["image"];
 9             //获取文件扩展名
10             string ext= Path.GetExtension(file.FileName);
11             if (ext == ".jpeg" || ext == ".jpg" || ext == ".gif" || ext == ".png")
12             {
13                 //设置文件的储存路径,Guid的目的是防止文件名相同
14                 string path = "/Image/" + Guid.NewGuid().ToString() + file.FileName;
15                 //保存文件到Image目录
16                 file.SaveAs(context.Request.MapPath(path));
17                 context.Response.Write("Upload Success!");
18             }
19             else
20             {
21                 //结束此次上传请求
22                 context.Response.Write("Upload Filed!");
23                 context.Response.End();
24             }
25         }
26 
27         public bool IsReusable
28         {
29             get
30             {
31                 return false;
32             }
33         }
34     }

 

 2.3完成前两步也并不是万事大吉,黑客可能还是会有方法将网马上传到我们的服务器。接下来我们要做的一步就是在IIS上把文件上传目录的权限设置成只读模式,这样在该目录下木马程序就不能被执行。

 

3.效果演示:

                 技术分享

 

文件上传漏洞原理以及防范

标签:

原文地址:http://www.cnblogs.com/gao-yang/p/4891437.html

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!