2013-04-27 45 views
2

我想用CreateMutex作爲限制我的應用程序到單個實例的一種手段。 (具體而言,每個用戶一個實例。)如果我使用「Local 」,是否需要擔心CreateMutex的拒絕服務?

The MSDN documentation to CreateMutex警告有可能首先惡意用戶搶奪並囤積互斥鎖。但是,如果我使用會話名稱空間(通過「Local \」前綴)創建互斥鎖,那仍然是我需要關注的事情嗎?如果是這樣,在不同的用戶會在什麼情況下在我的會話中創建一個互斥鎖?

+0

我認爲你最好擔心惡意*程序*。就像您的競爭對手中的一個人在登錄時自動啓動並創建該互斥體來阻止您。他們當然會聲稱解決「兼容性問題」非常重要。 – 2013-04-27 18:50:57

+0

@HansPassant如果那個惡意程序和我的用戶是同一個用戶,我看不出我能做什麼來防止這種情況發生。我對軍備競賽不感興趣。 – jamesdlin 2013-04-27 18:55:17

回答

3

使用Local\命名空間將保持隔離,以目前的桌面會話互斥體,但你也應該遵循該段的其他建議:

爲了防止這種情況,創建一個隨機命名的互斥和存儲名稱,以便它只能由授權用戶獲取。或者,您可以爲此使用文件。要將您的應用程序限制爲每個用戶一個實例,請在用戶的配置文件目錄中創建一個鎖定的文件。

使用類似CoCreateGuid產生互斥體的名稱,將其存儲在註冊表項和使用,或者鎖定在用戶的配置文件目錄中的文件。

建議使用難以猜測的ID的原因是,在不太可能的情況下,屬於不同用戶的多個進程在同一個會話中運行,您的進程具有使用難以猜測密鑰名稱的機制可以通過使用註冊表ACL機制來防止其他帳戶受到保護 - 即阻止其他非管理用戶讀取值,從而在此情況下保持安全。在使用鎖定文件的情況下,您可以獲得類似的保護,因爲主目錄中的默認ACL會阻止其他用戶創建或修改文件[*]。同樣,我聲明這實際上是不太可能的情況,但它是可能的(可以通過使用不同用戶憑證的系統服務啓動到特定會話中登錄的用戶)。

您是否試圖將其限制爲「每個用戶的單個實例」或「每個桌面會話的單個實例」?

如果它是每個會話的一個,那麼Local\互斥是適當的。

如果它是每個用戶一個(不管會話),那麼鎖定用戶配置文件目錄中的文件更合適。

您可以配置windows以允許具有相同用戶名的多個遠程終端服務登錄 - 默認情況下,它是每個用戶一個會話。

[*]如果用戶使用憑據或管理員憑據運行,所有這些機制都無效,因爲他們只能讀取此密鑰。這個想法是防止在同一會話中運行的其他帳戶

+0

但是*爲什麼我應該遵循這些建議?惡意用戶在什麼情況下可以首先使用「本地」互斥鎖? – jamesdlin 2013-04-27 19:09:41

+0

因爲這是一種防禦性的編程風格。您的實際擔心是針對惡意*應用程序*,而不是用戶,並且這些通常會在您的會話中最終運行**。 – Petesh 2013-04-27 19:22:07

+0

試圖抵禦惡意應用程序作爲同一用戶運行似乎徒勞。什麼阻止該應用程序使用我的隨機註冊表值創建互斥鎖或在我之前鎖定我的文件? – jamesdlin 2013-04-27 19:26:18

相關問題