c#中的linkdemand警告

时间:2012-03-04 16:44:27

标签: c# .net visual-studio visual-studio-2010

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

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

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

SecurityPermission(SecurityAction.LinkDemand, Flags = SecurityPermissionFlag.UnmanagedCode)]

但无法让它工作

非常感谢任何帮助

    #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

2 个答案:

答案 0 :(得分:7)

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

[PermissionSet(SecurityAction.LinkDemand, Name="FullTrust")]

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

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

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

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

答案 1 :(得分:-1)

这不是错误 - 这是一个警告。解释LinkDemand是什么的文档是here