2013-04-07 63 views
5

想象还有那会在业务,处理敏感信息(认为信用卡,社会保障,病历......等)中使用的关键过程。我认为这个单元理想地应该做任何动作,这意味着它不会有意将文件写入包含敏感信息的磁盘。这里的想法是,如果运行此过程的计算机受到威胁,则不会泄漏敏感信息,至少不会通过文件泄漏。如何测试给定的功能代码单元(C#)是否不创建/写入任何文件到磁盘?

什么样的方法可以采取,比如说,拿出一个单元测试,将失败如果被测单元试图写入任何文件保存到磁盘?

+0

编码规则来做到这一点。如果我是你,我会通过http://blogs.msdn.com/b/carloc/archive/2008/运行过程监控10/31/how-to-automate-process-monitor.aspx并解析单元测试运行器应用程序(nunit或其他)的文件写入输出。只是一个想法 – devshorts 2013-04-07 23:24:43

回答

6

还有就是FileSystemWatcher的(http://www.c-sharpcorner.com/uploadfile/puranindia/filesystemwatcher-in-C-Sharp/),但是这需要你知道一个特定的目录。在你的情况下,这可能不是很有用,因为程序可以在任何地方写入任何内容到磁盘。这引入了一个独特的问题。但是,我还发现了一些来自Microsoft的Detours。这似乎拦截所有原生的win32 API调用。 http://research.microsoft.com/en-us/projects/detours/这样做的问题是,它的那种难以测试,并将其集成到单元测试将是一个挑战。

当你在你需要证明它没做什么意识来对待你的软件为“不可信”,测试成为一项复杂的任务,需要你上运行它们非常受控制的环境。在连接到Win32 API时,您将会遇到需要快速处理的API调用。这可能会导致无意的副作用,因为应用程序未在真正的本地环境中运行。

我向你提出的建议(已经为制药自动化进行了几年的软件测试,符合FDA的严格标准)是创建一个受控环境,例如一个具有已知启动状态的虚拟机。这可以通过从不实际将vmdk更改保存到磁盘来完成。您必须拍摄文件系统的快照。你可以通过编写一个C#应用程序来枚举虚拟驱动器上的所有文件,获取它们的大小,一些时间戳,甚至是文件的哈希值。这可能很费时,所以你可能想要(或能够)跳过哈希。创建某种报告,最简单的方法是将它们放入CSV或XML导出中。然后,您在正常情况下运行您的软件一段时间。完成此操作后,再次运行文件系统分析并比较结果。有一些很好的应用程序用于比较文件内容(如WinMerge)。在拍摄这些快照时,最好的方法是将vmdk作为驱动器安装在主机操作系统中。这将绕过访客操作系统可能具有的任何文件锁定。

这种方法是耗时的,但相当彻底。如果你不需要这种深度的东西,你可以使用像Process Monitor这样的东西,并将输出写入一个文件并根据这个文件运行一个报告。但是在我的工作中,我必须证明Process Monitor在使用它之前显示所有IO,这可能与我上面提到的方法一样困难。

只是我2美分。

UPDATE:

我一直在想这件事,你可能能够实现相当可靠的结果,如果你从你的代码中删除,以System.IO所有引用。编写一个库来包装System.IO,它不会实现写入方法,或者只实现一个也写入日志文件的库。在这种情况下,您只需验证每次使用您的库进行写入操作时,它都会被记录下来。然后使用反射来验证您没有在这个新的包装库之外引用System.IO。然后,您的测试可以简单地查看此日志文件以确保只有经过批准的写入正在进行。您可以使用SQL数据库而不是平面日志文件来帮助避免篡改或污染结果的情况。与尝试编写像上面描述的虚拟机设置相比,这应该更容易验证。当然,这都需要你访问“不受信任”应用程序的源代码,但是由于你正在进行单元测试,所以我假设你这样做。

+0

我主要关心的是确保代码不会做任何不该做的事情。使虚拟机生成/快照/比较周期自动化会让我确信它是如此。 – 2013-04-09 13:35:06

+0

@ArcaArtem我想测试的另一种方法,让我知道你在想什么 – 2013-04-09 15:53:29

+0

作为@Fabske建议,抽象System.IO(如[System.IO.Abstractions(http://systemioabstractions.codeplex.com)),并使用FxCop/StyleCop限制开发人员不使用System.IO可以确保我们的代码不写入磁盘。与虚拟机方法相比,使用此方法收到的反馈速度会更快。但是,如果代码具有不受我们控制的依赖关系,则这不起作用。我认为在这种情况下应该使用两种方法,即限制内部的System.IO使用,使用VM快照比较来确保没有其他依赖写入磁盘。 – 2013-04-09 23:45:09

2

第一种选择:
也许你可以使用代码访问安全性,但“拒绝”是过时的.NET 4的(但应在以前版本的Works):

[FileIOPermission(SecurityAction.Deny)] 
public class MyClass 
{ 
    ... 
} 

您可以在激活此行为使用NetFx40_LegacySecurityPolicy

第二选择.NET 4:
减少特权的水平还可以的工作,因为我知道,下载的应用程序无法写到磁盘上,并且必须使用特殊的存储区域。

第3个选项:
删除对System.IO的任何引用,并替换为您的代码必须用于将数据写入磁盘的接口。
然后编写使用System.IO(在一个单独的项目)的实施
在NUnit测试,嘲笑这个接口并抛出一个异常时调用的方法ID。

问题是确保任何开发商不会调用System.IO了。您可以尝试通过强制使用的FxCop(或其他类似的工具)

+0

我从来没有考虑过使用StyleCop或FxCop来达到这个目的。好决定。 – 2013-04-08 01:27:30

+0

主要关注的是确保代码不会做它不应该做的事情。使用CAS或抽象System.IO将帮助我在我控制的代码上执行该操作,而不是外部依赖项。使用FXCop或同等版本是获得内部代码的即时反馈的好主意。 – 2013-04-09 13:41:24

相关问题