Python 如何正确清理文件名(防止shell注入)?

Python 如何正确清理文件名(防止shell注入)?,python,subprocess,sanitization,Python,Subprocess,Sanitization,在子流程(shell=False)中使用文件名之前,从外部源(例如xml文件)清理文件名的常见做法是什么 更新: 在发送一些经过解析的字符串之前,我想做一些基本的安全检查。给定的示例使用远程模式下的mpg123(命令行音频播放器)播放声音文件 filename = child.find("filename").text # e.g.: filename = "sound.mp3" pid = subprocess.Popen(["mpg123"],"-R"], stdin=subprocess.

在子流程(shell=False)中使用文件名之前,从外部源(例如xml文件)清理文件名的常见做法是什么

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

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+"\n"  
pid.stdin.write(command.encode())

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

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


让任何从网络或其他进程获取输入的程序接受绝对路径名通常不是一个好主意。在这种情况下,只允许指定已定义音乐文件夹下的文件。我不认为mp3播放器会因为提供了错误的文件而导致损坏,但至少你可以使它崩溃,这会很烦人。

我可以想到一些事情

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

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


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

如果不涉及shell,为什么要清理文件名?为了避免覆盖或读取系统/私有文件?清理什么?您需要提供更多详细信息。无论您做什么,请从
import os
help(os.path)
开始回答这个问题可能会有帮助:我们通常认为不会造成损害的程序。当然,我认为在这种特殊情况下,如果有的话,它可能是相当小的。@dietbuddha:当然,这就是为什么将它限制在特定目录中很重要的原因。不作为root运行,等等,但这是另一个问题。:)