File 检查文件是否驻留在基本目录中最安全的方法是什么?

File 检查文件是否驻留在基本目录中最安全的方法是什么?,file,validation,go,path,File,Validation,Go,Path,在Go中,在任何平台上验证给定文件路径是否位于基本路径中的最安全和最安全的方法是什么 路径最初以字符串形式提供,并使用“/”作为分隔符,但它们是用户提供的,我需要假设大量恶意输入。我应该执行哪种路径规范化,以确保对诸如“.”之类的序列进行评估,从而可以安全地对照基本路径进行检查?在各种文件系统和平台上有哪些例外情况需要注意?哪些Go图书馆在这方面应该是安全的 结果将反馈给外部函数,如os.Create和sqlite3.Open,任何无法识别基本路径的错误都将是安全冲突。我相信您可以使用filep

在Go中,在任何平台上验证给定文件路径是否位于基本路径中的最安全和最安全的方法是什么

路径最初以字符串形式提供,并使用“/”作为分隔符,但它们是用户提供的,我需要假设大量恶意输入。我应该执行哪种路径规范化,以确保对诸如“.”之类的序列进行评估,从而可以安全地对照基本路径进行检查?在各种文件系统和平台上有哪些例外情况需要注意?哪些Go图书馆在这方面应该是安全的


结果将反馈给外部函数,如
os.Create
sqlite3.Open
,任何无法识别基本路径的错误都将是安全冲突。

我相信您可以使用
filepath.Rel
(并检查它是否返回一个不以
开头的值。

Rel返回在词汇上与targpath等价的相对路径 使用中间分隔符连接到基本路径时。就是, Join(basepath,Rel(basepath,targetpath))等效于targetpath 它本身成功时,返回的路径将始终相对于 basepath,即使basepath和targpath不共享任何元素。一个错误是 如果targpath不能相对于basepath设置,或者如果知道 计算它需要当前工作目录。雷尔 对结果进行清理

filepath.Rel
还调用其输入路径上的
filepath.Clean
,解析任何
s和
s

Clean返回与路径相同的最短路径名 词汇处理。它反复应用以下规则,直到 无法进行进一步处理:

  • 用一个分离器元件替换多个分离器元件
  • 消除每一个。路径名元素(当前目录)
  • 消除每一个内部缺陷。。path name元素(父目录)以及非。。前面的元素
  • 消除。。以根路径开头的元素:即,假设分隔符为“/”,将路径开头的“/…”替换为“/”
  • 您还可以直接使用
    filepath.Clean
    并在完成后检查前缀。以下是
    filepath.Clean的一些示例输出:

    ps := []string{
        "/a/../b",
        "/a/b/./c/../../d",
        "/b",
    }
    for _, p := range ps {
        fmt.Println(p, filepath.Clean(p))
    }
    
    印刷品:

    /a/../b /b
    /a/b/./c/../../d /a/d
    /b /b
    


    也就是说,路径操作不应该是您部署的唯一安全机制。如果您确实担心漏洞攻击,请通过沙箱、创建虚拟文件系统/容器等进行深度防御。

    我相信您可以使用
    filepath.Rel
    (并检查它是否返回一个不以
    开头的值。

    Rel返回在词汇上与targpath等价的相对路径 使用中间分隔符连接到基本路径时。就是, Join(basepath,Rel(basepath,targetpath))等效于targetpath 它本身成功时,返回的路径将始终相对于 basepath,即使basepath和targpath不共享任何元素。一个错误是 如果targpath不能相对于basepath设置,或者如果知道 计算它需要当前工作目录。雷尔 对结果进行清理

    filepath.Rel
    还调用其输入路径上的
    filepath.Clean
    ,解析任何
    s和
    s

    Clean返回与路径相同的最短路径名 词汇处理。它反复应用以下规则,直到 无法进行进一步处理:

  • 用一个分离器元件替换多个分离器元件
  • 消除每一个。路径名元素(当前目录)
  • 消除每一个内部缺陷。。path name元素(父目录)以及非。。前面的元素
  • 消除。。以根路径开头的元素:即,假设分隔符为“/”,将路径开头的“/…”替换为“/”
  • 您还可以直接使用
    filepath.Clean
    并在完成后检查前缀。以下是
    filepath.Clean的一些示例输出:

    ps := []string{
        "/a/../b",
        "/a/b/./c/../../d",
        "/b",
    }
    for _, p := range ps {
        fmt.Println(p, filepath.Clean(p))
    }
    
    印刷品:

    /a/../b /b
    /a/b/./c/../../d /a/d
    /b /b
    


    也就是说,路径操作不应该是您部署的唯一安全机制。如果您真的担心漏洞攻击,请通过沙箱、创建虚拟文件系统/容器等进行深度防御。

    您尝试了什么?为什么filepath.Clean不足以满足您的需要。你如何定义“最安全的”?你尝试了什么?为什么filepath.Clean不足以满足您的需要。您如何定义“最安全的”?例如,这不会阻止路径中的符号链接。@阿德里安:正确,因此答案的附录。根据安全需要,这不太可能是一个完全令人满意的解决方案。例如,这将无法防御路径中的符号链接。@Adrian:正确,因此是答案的附录。根据安全需求,这不太可能是一个完全令人满意的解决方案。