重现的步骤
>使用Visual Studio 2010,创建一个ASP.NET MVC 3 Intranet应用程序。
>将其配置为使用IIS 7.5。
>打开它并注册一个帐户(以bob123为用户,Pa $$ w0Rd为密码。我假设sql Express数据库已创建并且站点完全正常运行。
>使用任务管理器,右键单击w3wp进程并创建转储。
>在能够以十六进制显示其内容的编辑器中打开转储,例如SlickEdit。
>在十六进制转储中搜索“Pa $$ 0Rd”和“Pa $$ w0Rd”。你应该能够找到它的几个副本存储为ASCII,Unicode或编码。
请注意,您是否使用HTTPS无关紧要,因为它只加密通信。 ASP.NET将数据存储在内存或磁盘中。
问题
常见的智慧有它加密敏感数据,而不是存储在明确。但是,员工可能会收到IIS / ASP.NET应用程序的转储,并发现用户的密码和其他机密数据,因为此信息既未加密,也未被ASP.NET使用的内存在使用后清除。
这使他们面临风险,只是因为他们有权使用它。转储有时与合作伙伴(如Microsoft)共享,以帮助他们诊断他们的代码中的问题。它是诊断一些应用中真正复杂问题的必要部分。
我看的东西
>对密码和其他敏感数据使用SecureString。但是,ASP.NET成员资格提供程序以及其他框架(如WCF)通常接受密码为System.String,这意味着这些副本仍然在转储中。
>看看在框架中是否有任何内容,以便在不再使用System.String时清除其副本。我找不到什么。
>调查是否可以清除用于请求和响应的内存,一旦IIS完成它,但我没有找到任何东西。
>我研究了可以加密文件IIS接收(作为HttpPostFile),使它们不存储在明确。我们可能收到非常机密的文档,并且每一步都是在服务器上加密和保护它们。但是,有人可以从IIS转储中清除它们。
我所希望的是告诉IIS / ASP.NET一个特定的请求/响应包含敏感数据和IIS / ASP.NET将清除内存时,使用它。