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

2024-04-25 01:21:49 发布

您现在位置:Python中文网/ 问答频道 /正文

在子进程中使用文件名(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())

Tags: 文件字符串false示例进程文件名stdinxml
2条回答

有几件事我能想到。在

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

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

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

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

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

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

相关问题 更多 >