有人可以在子类化Windows控件时解释这个LinkDemand警告吗?我有这个HeaderlessTabControl,它是经典TabControl的子类。//来自http://social.msdn.microsoft.com/forums/en-US/winforms/thread/c290832f-3b84-4200-aa4a-7a5dc4b8b5bb///作者:HansPassant(nobugz)publicclassHeaderlessTabControl:TabControl{protectedoverridevoidWndProc(refMessagem){//通过捕获TCM_ADJUSTRECT消息隐藏选项卡if(m.Msg==0x1328&&!DesignMode){m.Result=(IntPtr)1;}else{base.WndProc(refm);当我在我的项目上运行代码分析时,我收到此警告:Warning1CA2122:Microsoft.Security:'HeaderlessTabControl.WndProc(refMessage)'calls'Message.Msg.get()withLinkDemand'。通过进行此调用,“Message.Msg.get()”间接暴露给用户代码。查看以下方法的调用堆栈可能会发现安全绕过:->'HeaderlessTabControl.WndProc(refMessage)'->'HeaderlessTabControl.WndProc(refMessage)'...和??Message.Msg.set()和TabControl.WndProc()相关的两个类似的警告。我知道这样做会暴露一些代码。有人可以解释我可能在这里打开的安全漏洞以及可能的解决方法吗?我想我要问的是,我应该寻找哪些可能的安全漏洞?让我向您简要介绍一下“传统的”.NET代码访问安全性。(我们有一个更新的、简化的安全模型,应该用于新代码,但了解底层安全模型是有帮助的。)这个想法是程序集提供证据——比如他们住在哪里,是谁写的,等等。政策使用证据并生成与程序集关联的授权权限集。当尝试需要特定权限的操作时(例如,创建对话框或访问打印机或写入文件),运行时会请求该权限。要求检查当前“在堆栈上”的代码,以识别直接或间接调用当前代码的所有代码。(*)Requirements表示堆栈中的每个调用者都必须获得所需的权限。这可以防止引诱攻击,在这种情况下,恶意的低信任代码调用良性的高信任代码并“诱骗”它代表自己做一些危险的事情,从而伤害用户。诱饵攻击被击败,因为对直接和间接调用者的所有要求都进行了检查。断言允许高置信度代码修改需求语义。断言说“我是良性的高信任代码,我断言我不会被低信任的恶意调用者欺骗以代表它执行危险的操作。”断言通常与较弱的需求配对;也就是说,高信任代码断言“我可以安全地调用非托管代码,即使调用者不能”,然后询问“但是调用者最好能够访问打印机,因为这就是我要为我的非托管操作请求许可代码”。需求的问题在于它们很昂贵。您必须进行完整的堆栈检查并查看每个人的权限集。如果操作成本低——例如,调整位图中的像素——你不想每次都准确地做,因为你会把所有的时间都花在做冗余的安全检查上。因此链接要求。每个调用者都对受保护方法执行链接请求,第一次使用调用受保护方法的代码时,它只检查受保护方法的直接调用者,而不是执行完整的堆栈遍历。之后,执行链接所需的代码操作,而无需对该调用者进行安全检查。(它实际上应该被称为“jitdemand”,而不是“chainingdemand”,因为使用的机制是在调用者被jitted时检查需求。)显然这更便宜——只检查每个调用者的一个程序集比每个更便宜——更危险的是-一次检查堆栈中的每个组件。链接要求基本上是推卸责任。链接要求说“呼叫,通过我的链接要求检查,从现在开始你可以便宜地打电话给我。但是我现在关闭了安全系统,所以你现在有责任确保你的呼叫者不能通过采取成功攻击用户以后我会授予你在没有安全检查的情况下给我打电话的权利。”您正在调用具有链接要求的方法。所以你面临的问题是:你愿意承担这个责任吗?您可以廉价地调用此方法。你想保证没有低信任度的恶意调用者可以利用你在没有安全检查的情况下调用方法来伤害用户吗?如果您不愿意或不能做出此保证,请在链接上发出您自己的许可请求;这将要求所有调用者满足请求。或者,将责任推给调用者:向调用者发出链接请求并让他们完成工作。(*)正如我想指出的那样,调用堆栈实际上并没有告诉您是谁调用了您,它只是告诉您下一个控件在哪里。由于这些通常是相同的,所以一切都很好。在“谁在给你打电话?”情况,最终可能会是这样。已经远离“你下一步要去哪里?”;在这些环境中,您必须非常小心传统风格的代码访问安全性。较新的“沙箱”安全模型更适合这些场景。FxCop的警告可能有点过分了。情况确实如此,这段代码总是会命中CAS需求,因为它调用了base.WndProc()。最终像这样调用Control.WndProc():[SecurityPermission(SecurityAction.InheritanceDemand,Flags=SecurityPermissionFlag.UnmanagedCode)][SecurityPermission(SecurityAction.LinkDemand,Flags=SecurityPermissionFlag.UnmanagedCode)]protectedvirtualvoidMWagendProc{//等等。..}InheritanceDemand就足够了。您可以安全地忽略此警告。C#学习教程就这些了:有人可以解释继承Windows控件时出现的LinkDemand警告吗?如果所有分享的内容对你有用,需要进一步了解C#学习教程,希望大家多多关注。本文收集自网络,不代表立场。如涉及侵权,请点击右侧联系管理员删除。如需转载请注明出处:
