You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

Go文件上传Handler遭Checkmarx路径遍历误报?求分析

关于Checkmarx误报Go文件上传接口路径遍历漏洞的分析与解决

结论:这是Checkmarx的误报,原代码不存在路径遍历风险

你的原代码完全没有路径遍历漏洞,原因很直接:

  • 目标文件路径是硬编码固定值./my-test-file,全程没有使用任何用户可控的路径、文件名参数
  • 不管用户上传的文件内容是什么、文件名带什么路径,最终都会写入到这个固定文件里,根本无法访问到系统其他路径的文件

为什么会触发扫描告警?

Checkmarx的静态扫描规则大概率是做了简单的规则匹配:检测到你读取了用户可控的FormFile输入,后续又执行了文件写入操作,就直接触发了路径遍历的告警,没有精准识别到目标路径是完全硬编码、和用户输入无关的逻辑。

替换io.Copy为ReadAll+Write后扫描通过的本质

这个修改只是绕过了扫描工具的规则匹配,代码逻辑和风险完全没有变化。扫描工具可能只是把io.Copy关联到了“危险文件操作”的规则里,换成ReadAll再写入的写法刚好避开了这个规则检测,但实际上两种写法的文件写入逻辑是一致的。

真正的处理方案

  1. 提交误报申诉:向Checkmarx平台提交这个案例的申诉,说明代码中目标路径是硬编码,没有使用任何用户可控的路径参数,请求标记为误报。
  2. 修复代码错误处理(重要):原代码忽略了所有错误(os.OpenFile、FormFile、io.Copy的错误都被丢弃),这是实际的代码质量问题,虽然和路径遍历无关,但必须修复,示例代码如下:
func uploadHandler(w http.ResponseWriter, r *http.Request) {
    // 打开目标文件,处理错误
    targetFile, err := os.OpenFile("./my-test-file", os.O_WRONLY|os.O_CREATE, 0644)
    if err != nil {
        http.Error(w, "打开目标文件失败", http.StatusInternalServerError)
        return
    }
    defer targetFile.Close()

    // 获取上传文件,处理错误
    file, _, err := r.FormFile("file")
    if err != nil {
        http.Error(w, "获取上传文件失败", http.StatusBadRequest)
        return
    }
    defer file.Close()

    // 写入文件,处理错误
    _, err = io.Copy(targetFile, file)
    if err != nil {
        http.Error(w, "写入文件失败", http.StatusInternalServerError)
        return
    }

    w.WriteHeader(http.StatusOK)
}
  1. 若需临时绕过扫描:可以保留你替换io.Copy的写法,但要明确这只是绕过规则,不是修复漏洞。

内容的提问来源于stack exchange,提问作者Yaya

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.16 04:33:17