2011-01-19 59 views
2

在子流程(shell = False)中使用它之前,從外部源(例如:xml文件)中清理文件名的常見做法是什麼?如何正確清理文件名(防止shell注入)?

更新: 在發送一些經過解析的字符串之前,我想進行一些基本的安全檢查。給出的示例使用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()) 
+0

爲什麼你要清理文件名,如果沒有涉及shell? – lunaryorn 2011-01-19 11:52:17

+1

爲避免覆蓋或讀取系統/私人文件? – TryPyPy 2011-01-19 11:54:42

回答

1

除非您使用shell或執行任何操作,否則不需要對文件名進行清理。 Pythons open()不會執行給定文件名中的任何命令。

對於安全檢查,爲避免覆蓋文件,您使用操作系統的權限系統,並確保運行程序的用戶只能覆蓋和訪問應該能夠覆蓋和訪問的文件。

讓任何從網絡或其他進程接收輸入的程序接受絕對路徑名通常不是一個好主意。在這種情況下,應該只允許在指定的音樂文件夾下指定文件。我不認爲MP3播放器可能會通過給它錯誤的文件造成損壞,但至少可以讓它崩潰,這會很煩人。

3

有幾件事我能想到。

如果系統允許,可以進行輕量級驗證。如果數據銷燬的可能性很小,或者敏感數據受到損害,這也可能是適當的。您可以使用os.path.isfile來測試您的字符串是否爲實際文件。

更經典的「安全」編程設計可以讓您索引可以播放的可接受文件並根據用戶輸入進行查找。用這種方式你永遠不會傳遞用戶輸入。它通過查找已被驗證的數據(被接受的可播放文件列表)「過濾」。

「消毒」輸入是一種黑名單類型的技術。他們總是比白名單型技術(上文)安全。如果您別無選擇,只能「清理」數據,則必須瞭解數據如何通過您的系統以及您依賴的任何其他系統。然後,您必須制定規則,以考慮所有系統中的任何缺陷或限制。您還需要涵蓋經典的惡意輸入案例,如數據輸入大小,不可接受的字符編碼等。