2012-06-30 73 views
4

最近我正在調試「poof-all-customer-data-is-gone」問題。不需要太多時間就可以發現一個錯誤的分支導致了一行代碼Directory.Delete(customerRoot, true)。災難性的產品線是由一個普通的GUI開發人員編寫的。沒有太多的線路會導致這樣的災難。所以我的問題是如何防止這個特定的電話。 (DirectoryInfo.Delete()是第二個)。如何防止或攔截對Directory.Delete(path,true)的調用

這是我優先考慮的可能的解決方案列表

  • 沒有第三方改變構建過程
  • 運行時攔截,沒有第三方
  • 運行時攔截與第三方(編譯錯誤沒有改變構建過程)
  • 編譯錯誤與第三方(我猜PostSharp會這樣做)
  • 關於GUI開發者關於如何客戶的教育研討會查看他們的數據

還有其他想法嗎?

我會提到我們的系統有一個專門的服務(驗證和記錄)文件/文件夾刪除。

+1

無論是從技術角度還是從社會角度來看,您都可以在這裏實施許多防線。但在這種特殊情況下,您可能會考慮將ACL標記爲只讀或標記爲只讀的任何文件資源,以確保不會意外刪除。或者也許可以通過有限訪問系統來運行GUI? – reuben

回答

1

爲「攔截」在運行時調用,您可以使用FileSystemWatcher類,但它不會阻止實際刪除,只是讓你知道它的發生。防止實際刪除是非常棘手的。 Windows不提供Linux的ptrace功能,所以你不能攔截系統調用本身(有一篇關於here的文章,但是可用性相當有限)。別人的建議 - 設置訪問權限和信任級別 - 可能會起作用,但是當你確實需要刪除某些內容時,你的「刪除服務」只是.NET方法的一個包裝,你也會阻止它的工作。

另一個選擇是去第三方工具,並在編譯時檢查 - this question正是你需要的,包括例子,還有更多的工具可以做到這一點(我只使用Resharper,但是我會想象它也可以完成這項任務)。

但是,我不認爲這是重點。你的開發者犯了一個錯誤,它扼殺了一些客戶數據,沒有人對此感到高興。這並不意味着你需要制定一個全系統的規則並執行該規則,這意味着開發者應該更好地測試他或她的代碼,並且/或者應該使用你提到的刪除服務(不管是什麼)。不管你多努力,你都不能阻止人們做愚蠢的事情。你不想花時間和金錢圍繞Directory.Delete()方法制造防禦工事,只是爲了發現別人犯了一個不同的愚蠢的錯誤,這個特殊的事情永遠不會再成爲問題。除非像這樣的問題(濫用Directory.Delete())在你的系統中比平常更容易發生,否則就放手吧,專注於其他事情。

0

您可以在全局包含的命名空間中包含一個單獨的目錄類(和DirectoryInfo) - 這不會阻止某人使用System.IO.Directory.Delete,但這是另一個可能有助於捕獲它並將其放入其中的想法關閉,特別是如果你包含一個相同的虛擬函數,並拋出一個異常與消息。

1

您可以修改應用程序使其不能以完全信任的方式運行。配置限制訪問物理磁盤的信任級別。 Take a look at FileIOPermission。請注意,這可以針對特定位置進行配置,從而爲您提供適當的控制。

A good overview of demands

更新 思考這個多一些之後,我也建議「保姆測試」。如果您正在進行任何類型的測試,則可以添加一個測試來查看程序集中的所有類型,並檢查對任何FileSystem方法的調用。任何此類呼叫都需要在白名單上,否則測試將失敗。我正在研究的項目使用了這個項目,它提供了一個批次的價值。

更新2 有關於如何做這種類型的保姆測試的評論。基本上,您需要使用反射來獲取所有方法,然後在IL中查找禁止的呼叫。這聽起來比現在更復雜。

Mechanism to extract specific IL (.NET Intermediate Language) signatures from an assembly

更新3 還有另外一個更好的,這樣做這類保姆的測試,不直接涉及與IL搞亂。我在博客上發佈了一篇文章,介紹如何做到這一點。

http://datatoknowledge.com/2012/09/10/nanny-tests/

埃裏克

+0

你可以詳細解釋一下_「查看程序集中的所有類型,並檢查對任何FileSystem方法的調用」。怎麼做? –