如何使您的WPF应用程序防窥?

34

Snoop可以让你查看应用程序内部并更改元素属性。这对开发人员来说是一项重要的资源,但在某些情况下可能会造成安全问题,例如当我们有用户想要查看不该看的地方时。有没有办法阻止像Snoop这样的应用程序"窥探"你的应用程序呢?

如果没有办法阻止它,你建议采取什么措施来最小化安全风险呢?

Snoop是一个实用工具,允许您浏览WPF应用程序的可视化树并查看和更改属性。当您试图调试某些内容时并不知道出了什么问题时,非常有用。您可以在这里找到更多信息。

谢谢。


好问题,我自己也一直在想。 - Fredrik Hedblad
1
你能提供更多关于"Snoop"程序的信息吗?或者可以发布一个相关信息的链接吗? - John Saunders
3个回答

47

实际上,有一种方法可以检测您的应用程序是否被“监视”了。我将提供的解决方案并不是万无一失的,如果某人真的想要窥探您的应用程序,他们必须修改snoop源代码(这是一个开源项目)。

snoop实际上做的是将一个程序集注入到您的应用程序中,并且递归地检查从根节点开始的应用程序可视树。换句话说,snoop实际上在您的应用程序中运行。尽管如此,解决方案是在注入snoop程序集时触发一个事件。

首先,在您的应用程序中的某个位置(最好是开头)订阅程序集加载事件:

AppDomain.CurrentDomain.AssemblyLoad += new AssemblyLoadEventHandler(CurrentDomain_AssemblyLoad);

那么,你需要像这样实现处理程序:

        void CurrentDomain_AssemblyLoad(object sender, AssemblyLoadEventArgs args)
    {
        if (args.LoadedAssembly.FullName.StartsWith("ManagedInjector"))
            MessageBox.Show("hey you, stop snooping");//and shut down your application.
    }

你可能需要改进这个解决方案才能实现完美的防护,但至少这个解决方案可以确保当前最新版本的snoop不能直接运行(没有修改代码)。更好的解决方案是检查是否有外部程序集被注入到你的应用程序中。

然而,Kent仍然是正确的,因为像Snoop这样的工具不应该导致任何安全漏洞,因为安全性不应该在UI层面实现。但至少这向你展示了如何防止人们“窥视”你的应用程序。


4
太好了。结合肯特的回答,正是我所要找的。 - chiefanov

37

通过正确实现安全措施。如果你的“安全”可以被像 Snoop 这样的工具破解,那么做法是错误的。

假设有一个只有特定用户才能执行的命令。如果你只在用户界面上执行这个约束条件(例如禁用相应的按钮),那么你是正确的——我可以轻松使用 Snoop 启用按钮并执行命令。但你应该在服务器上或者如果没有服务器则在你的命令执行逻辑中强制实施安全限制。基本上,安全性应该尽可能地靠近你要保护的东西。在用户界面上的安全只是为了方便用户而已。


肯特,谢谢您的回复。我同意您的看法,安全性不应该在用户界面层面实现。在我的项目中,我们使用命令,并且在CanExecute中有逻辑来禁用某些用户的按钮(它们不能使用snoop重新启用),以及服务器保障措施,防止用户能够做某些事情。然而,我们还有其他不使用命令的应用程序,按钮只是被隐藏,所以它们可以轻松地“窥视”。 - chiefanov

0

针对一个非常好的问题,回应非常棒,

我想添加一个密码示例,它永远不应该保存在您的数据上下文中,因为Snoop也会检查UI的数据上下文,所以如果您使用正确的控件PasswordBox,您会发现无法绑定密码属性,这意味着即使您窥探应用程序,也无法获取密码,因为它未保存在任何属性中

但是我们发现许多人尝试创建解决方案(帮助器、行为、用户控件...)来绑定密码,但他们忘记了Snoop可以像那样获取密码

因此,您的服务器永远不应信任客户端,每次都应检查正确的权限(因为我们可以使用Fiddler来嗅探客户端请求,然后重建自定义请求以绕过客户端应用程序安全性)


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接