gpt4 book ai didi

python - 如何在Python3中只允许打开当前目录中的文件?

转载 作者:行者123 更新时间:2023-11-30 22:43:58 24 4
gpt4 key购买 nike

我正在用 Python 编写一个简单的文件服务器。文件名由客户端提供,应被视为不可信。如何验证它是否对应于当前目录(在其或其任何子目录中)内的文件?会像这样:

pwd=os.getcwd()
if os.path.commonpath((pwd,os.path.abspath(filename))) == pwd:
open(filename,'rb')

够了吗?

最佳答案

使用 os.path.realpath 将文件名转换为规范路径,获取目录部分,并查看当前目录(以规范形式)是否是该目录的前缀:

import os, os.path

def in_cwd(fname):
path = os.path.dirname(os.path.realpath(fname))
return path.startswith(os.getcwd())

通过将 fname 转换为规范路径,我们可以处理包含 ../ 的符号链接(symbolic link)和路径。

<小时/>

更新

不幸的是,上面的代码有一个小问题。例如,

'/a/b/cd'.startswith('/a/b/c')

返回True,但我们绝对不希望出现这种行为!幸运的是,有一个简单的修复方法:我们只需在执行前缀测试之前将 os.sep 附加到路径即可。新版本还通过os.path.normcase处理任何操作系统路径名不区分大小写的问题。 .

import os, os.path

def clean_dirname(dname):
dname = os.path.normcase(dname)
return os.path.join(dname, '')

def in_cwd(fname):
cwd = clean_dirname(os.getcwd())
path = os.path.dirname(os.path.realpath(fname))
path = clean_dirname(path)
return path.startswith(cwd)

感谢 DSM 指出之前代码中的缺陷。

<小时/>

这是一个更高效的版本。它使用 os.path.commonpath ,这比附加 os.sep 并进行字符串前缀测试更稳健。

def in_cwd(fname):
cwd = os.path.normcase(os.getcwd())
path = os.path.normcase(os.path.dirname(os.path.realpath(fname)))
return os.path.commonpath((path, cwd)) == cwd

关于python - 如何在Python3中只允许打开当前目录中的文件?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/41633206/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com