• 【必须】 路径穿越检查


    1.2.1【必须】 路径穿越检查

    • 在进行文件操作时,如果对外部传入的文件名未做限制,可能导致任意文件读取或者任意文件写入,严重可能导致代码执行。
    // bad: 任意文件读取
    func handler(w http.ResponseWriter, r *http.Request) {
    	path := r.URL.Query()["path"][0]
    
    	// 未过滤文件路径,可能导致任意文件读取
    	data, _ := ioutil.ReadFile(path)
    	w.Write(data)
    
    	// 对外部传入的文件名变量,还需要验证是否存在../等路径穿越的文件名
    	data, _ = ioutil.ReadFile(filepath.Join("/home/user/", path))
    	w.Write(data)
    }
    
    // bad: 任意文件写入
    func unzip(f string) {
    	r, _ := zip.OpenReader(f)
    	for _, f := range r.File {
    		p, _ := filepath.Abs(f.Name)
    		// 未验证压缩文件名,可能导致../等路径穿越,任意文件路径写入
    		ioutil.WriteFile(p, []byte("present"), 0640)
    	}
    }
    
    // good: 检查压缩的文件名是否包含..路径穿越特征字符,防止任意写入
    func unzipGood(f string) bool {
    	r, err := zip.OpenReader(f)
    	if err != nil {
    		fmt.Println("read zip file fail")
    		return false
    	}
    	for _, f := range r.File {
    		if !strings.Contains(f.Name, "..") {
    			p, _ := filepath.Abs(f.Name)
    			ioutil.WriteFile(p, []byte("present"), 0640)
    		} else {
    			return false
    		}
    	}
    	return true
    }

     

  • 相关阅读:
    django 参考
    数据库答案
    django -- form表单
    django ajax
    Django----中间件详解
    ORM中自定义一个char类型字段
    北理工《网站设计与开发实践》在线作业 附答案
    正则表达式 ?P<name>
    Django模板语言相关内容
    【CSS】 布局之多列等高
  • 原文地址:https://www.cnblogs.com/rsapaper/p/15841788.html
Copyright © 2020-2023  润新知