关于python:如何正确地清理文件名(防止shell注入)?

How to properly sanitize a filename (protect against shell injection)?

在子进程(shell=false)中使用文件名之前,从外部源(如xml文件)清除文件名的常见做法是什么?

更新:在发送一些解析的字符串之前,我想做一些基本的安全检查。给出的示例使用远程模式下的mpg123(命令行音频播放器)播放声音文件。

1
2
3
4
5
filename = child.find("filename").text # e.g.: filename ="sound.mp3"
pid = subprocess.Popen(["mpg123"],"-R"], stdin=subprocess.PIPE, stdout=subprocess.PIPE, stderr=subprocess.PIPE)
command ="L"+filename+"
"
 
pid.stdin.write(command.encode())


我能想到一些事情。

如果系统是可容忍的,则可以进行轻量级验证。如果数据破坏或敏感数据泄露的可能性很小,也可能是适当的。您可以使用os.path.isfile测试给定的字符串是否是实际文件。

一个更经典的"安全"编程设计将让您索引可以播放的可接受文件,并根据用户输入进行查找。这样,您就不会真正地传递用户输入。它通过查找已验证的数据(可接受的可播放文件列表)进行"过滤"。

"消毒"输入是一种黑名单技术。它们总是比白名单类型的技术(上面)更不安全。如果您别无选择,只能"清理"数据,那么您必须了解这些数据是如何通过您的系统以及您所依赖的任何其他系统传递的。然后,您必须制定规则来考虑所有系统中的任何缺陷或限制。您还必须覆盖典型的恶意输入情况,如数据输入大小、不可接受的字符编码等。


文件名不需要进行清理,除非您正在使用shell或执行任何操作。pythons open()不会执行给定文件名中的任何命令。

对于安全检查,为了避免覆盖文件,可以使用操作系统的权限系统,并确保运行程序的用户只能覆盖和访问其应该能够覆盖和访问的文件。

一般来说,让任何从网络或其他进程接收输入的程序接受绝对路径名都不是一个好主意。在这种情况下,只允许在已定义的音乐文件夹下指定文件。我不认为MP3播放器会因为输入错误的文件而造成损坏,但至少你可以把它弄坏,那会很烦人。