c#中的linkdemand警告

Ces*_*sar 3 .net c# visual-studio-2010 visual-studio

我想在我的DLL中获取Iexplorer.exe的版本.但是每次都会收到此警告

警告1 CA2122:Microsoft.Security:'ApCkr.IEavailable()'调用具有LinkDemand的'FileVersionInfo.FileMajorPart.get()'.通过进行此调用,'FileVersionInfo.FileMajorPart.get()'间接地暴露给用户代码.查看以下可能提供绕过安全保护的方法的调用堆栈:

在MSDN(安全权限)和falgs中进行大量搜索后,我仍然无法知道如何摆脱这个错误.我试过了

SecurityPermission(SecurityAction.LinkDemand, Flags = SecurityPermissionFlag.UnmanagedCode)]
Run Code Online (Sandbox Code Playgroud)

但也无法让它发挥作用

任何帮助将非常感激

    #region IExplore

    public string IEavailable()
    {
        bool IEversion;

        FileVersionInfo.GetVersionInfo("C:\\program files\\\\Internet Explorer\\iexplore.exe");
        FileVersionInfo myFileVersionInfo = FileVersionInfo.GetVersionInfo("C:\\program files\\\\Internet Explorer\\iexplore.exe");
        int a = myFileVersionInfo.FileMajorPart;
        if (a < 8)
        {
            IEversion = false;
        }
        else
        {
            IEversion = true;
        }
        return IEversion.ToString();
    }
    #endregion
Run Code Online (Sandbox Code Playgroud)

Han*_*ant 7

这是它正在讨论的FileVersionInfo类的链接需求属性:

[PermissionSet(SecurityAction.LinkDemand, Name="FullTrust")]
Run Code Online (Sandbox Code Playgroud)

这在MSDN文章中有很好的记录,但并不总是很容易从FxCop消息中提取.我个人觉得Reflector非常方便解决这个问题.

链接需求是在运行时检查的非常便宜的需求.它只是在即时编译时执行,只执行一次,只检查直接调用者的权限.发生可能的安全性泄漏是因为稍后可能会被其他代码调用属性getter .这样的代码不会得到相同的需求检查,因为您的属性缺少属性并且已经被jitted.您必须应用相同的安全属性.

当这样的代码在没有 FullTrust的情况下运行时,这只会是一个问题.有点难以想出这样的场景,你必须创建自己的沙箱并将你的属性暴露给这样的沙盒代码.如果您想知道能够检查DLL版本的安全隐患:确切知道程序使用的DLL版本对于找出攻击向量非常重要.

FxCop不够智能,无法检测到这种情况.它实际上是一种工具,只会发出你可能忽略的事情的警告.你可能做到了.CAS很难理解,我自己也很挣扎.在其他所有人中,由于这一点,它在.NET 4中被弃用,取而代之的是安全的沙盒模型.明智之举,不可理解的安全性是不安全的.