如何防止在IIS / ASP.NET转储文件中提交和接收ASP.NET网页的密码和其他敏感数据?
Steps to reproduce
-
使用Visual Studio 2010,创建ASP.NET MVC 3 Intranet应用程序 .
-
将其配置为使用IIS 7.5 .
-
启动它并注册一个帐户(比如bob123作为用户,而pa $$ w0Rd作为密码 . 我假设创建了SQL Express数据库并且网站功能完备 .
-
使用任务管理器,右键单击w3wp进程并创建转储 .
-
在能够以十六进制显示其内容的编辑器中打开转储,例如SlickEdit .
-
在十六进制转储中搜索"Pa$$0Rd"和"Pa%24%24w0Rd" . 您应该能够找到以ASCII,Unicode或编码形式存储的多个副本 .
请注意,使用HTTPS无关紧要,因为它只会加密通信 . ASP.NET将数据存储在内存或磁盘中 .
The problem
通用的智慧是加密敏感数据而不是将其存储在清晰的数据中 . 但是,员工可能会收到IIS / ASP.NET应用程序的转储并发现用户的密码和其他机密数据,因为此信息既未加密,也未在使用后清除ASP.NET使用的内存 .
这使他们处于危险之中,因为他们可以访问它 . 有时会与合作伙伴(例如Microsoft)共享转储,以帮助他们诊断代码中的问题 . 它是在一个应用程序中诊断一些非常复杂的问题的必要部分 .
Things I looked at
-
对密码和其他敏感数据使用SecureString . 但是,ASP.NET成员资格提供程序以及其他框架(如WCF)通常接受密码作为System.String,这意味着这些副本仍将在转储中 .
-
查看框架中是否有任何内容在不再使用时清除System.String的副本 . 我找不到任何东西 .
-
调查一旦IIS完成后,是否可以将用于请求和响应的内存清零,但我无法找到任何内容 .
-
我调查了一个可以加密IIS接收的文件(如HttpPostFile),以便它们不会以明文形式存储 . 我们可能会收到极其机密的文档,并且每一步都会在服务器上加密和保护它们 . 但是,有人可以从IIS转储中清除它们 .
我希望的是告诉IIS / ASP.NET特定请求/响应包含敏感数据,并且IIS / ASP.NET将在使用它时清除内存 .
2 回答
根据定义,转储文件会转储应用程序在转储时使用的所有内存 . 如果要创建过滤器以便排除某些内容,那么您永远无法确定是否有足够的数据来解决问题 .
您是否愿意将数据库/配置设置移交给第三方?如果没有那么你可能不应该交出dumpfiles . (恕我直言)
我知道这不能直接回答这个问题,但为什么不以不同的方式看待这个问题 .
您可以轻松地将一些javascript放在一起进行哈希客户端 . 我会将密码与随机的东西组合在一起,例如服务器发送的guid,只对一次使用有效 . 数据交换将不再包含密码,并且哈希可以很容易地与服务器端进行比较 . 它只对会话有效,因此查看转储数据的人将来无法使用哈希“自我验证” .
在文件方面,这些文件是如何上传的?直接来自网页?有很多javascript库进行加密(河豚),我肯定会在发送敏感文件时使用此选项 . 它确实有速度惩罚,但您可以确定数据是安全的 .