2017-11-11 250 views
1

對不起,如果這個問題已經得到解答,但我似乎無法找到解決方案。 (關於一般設置文件的許多問題,甚至一些提到這個問題,但沒有解決它)如何確保設置文件在Python中是安全的?

我有一個Python程序將運行一個Powershell腳本作爲子進程。 (Python處理圖形用戶界面,Powershell做煩人的工作來安排任務等)

我的查詢是否有一個安全的方式來有一個設置文件,其中包含可以加載到Python的Powershell腳本的參數,是耐惡意代碼注入?我能想到的唯一方法就是加密設置文件,這很好,但是您無法在不通過GUI的情況下快速更改設置。有沒有一個聰明的方法來解決這個問題?

當調用Powershell的我用的是簡單的:

subprocess.Popen(['powershell.exe', args], 
        stdout=subprocess.PIPE, stderr=subprocess.PIPE) 

或許有這樣做盾反ARGS其中具有意想不到的代碼的更好的辦法?

任何答案非常感謝!謝謝! :d

回答

3

正確的方式,以確保您的設置文件是安全的保存配置而不是代碼參數。 (對於powershell.exe參數基本上代碼)

在你的配置文件中存儲的PowerShell參數的原因有兩個是錯誤的:

  1. 這是容易發生代碼注入。
  2. 這聽起來像Powershell不是你的程序的重要組成部分;這是一個實現細節。如果你曾經決定用別的工具代替Powershell,你的配置文件就沒用了。

取而代之,您應該存儲數據。數據無疑只是數據,而不是任何形式或形式的代碼。然後,您可以從此數據創建一個適當的powershell命令,如果需要時。

例如,不應保存powershell參數sleep 3; echo Hello,而只應保存重建此powershell命令所需的值。一個選擇會是這樣一個JSON文件:

{ 
    "delay": 3, 
    "text_to_display": "Hello" 
} 

您可以輕鬆地從這些數值重建命令sleep 3; echo Hello,如果有人修改了你的配置文件沒有什麼危險都可能發生,因爲它不是代碼。 (當你將它們轉換成代碼只要你殼逃避這些值。)


在你實際上必須存儲在您的配置文件中的代碼極少數情況下(例如,因爲你寫一個任務調度程序),你基本上運氣不好。您可以嘗試通過加密配置文件來使代碼注入變得更加困難,但最終這對攻擊者來說只是一個煩惱,並且不提供任何真正的安全性(除非讓用戶選擇密碼,但是必須每次使用您的程序時提示用戶輸入密碼)。

如果您將代碼存儲在配置文件中,您必須忍受相關的代碼注入危險。確保你和你的用戶知道風險。