Snoop 允许您查看应用程序内部并更改元素属性。它对开发人员来说是一项巨大的资产,但在某些情况下可能是一个安全问题,例如当我们有用户喜欢查看他们不应该查看的地方时。有没有办法阻止像 Snoop 这样的应用程序“窥探”您的应用程序?
如果没有办法阻止它,您建议如何将安全风险降到最低?
Snoop 是一个实用程序,可让您浏览 wpf 应用程序的可视化树并查看和更改属性。当您尝试调试某些东西并且不知道发生了什么时,它非常有用。你可以在这里找到更多。
谢谢你。
实际上有一种方法可以检测您的应用程序是否被 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 级别实现。但至少这向您展示了如何防止人们“窥探”您的应用程序。
通过正确实施安全性。如果你的“安全性”可以被像 Snoop 这样的工具所阻挠,那么你做错了。
假设有一个只有特定用户才能执行的命令。听起来您执行此操作的唯一地方是在 UI 级别(例如,通过禁用相应的按钮)。既然如此,你是对的——我可以很容易地使用 Snoop 来启用按钮并执行命令。但是你应该在你的服务器上执行安全约束,或者如果你没有服务器,可能在你的命令执行逻辑中。基本上,安全性应该尽可能接近您要保护的东西。UI 级别的安全性只是为了方便用户。
对一个非常好的问题的很好的回答,
我想添加一个永远不应该保存在数据上下文中的密码示例,因为 snoop 还会检查 UI 的数据上下文,所以如果您使用正确的控件 PasswordBox 您会发现您无法绑定密码属性,即意味着即使您窥探应用程序,您也无法获取密码,因为它没有保存在任何属性中
但是我们发现很多人试图创建一个变通方法(助手、行为、用户控件......)来绑定密码,但他们忘记了 snoop 可以这样获取它
所以你的服务器永远不应该信任你的客户端,每次它都应该检查正确的权限(因为我们可以使用 Fiddler 嗅探客户端请求,然后重建一个客户请求以绕过客户端应用程序安全性)