【问题标题】:What does the statement "delegates are secure" mean?“代表是安全的”这句话是什么意思?
【发布时间】:2023-03-23 19:59:01
【问题描述】:

在委托的C# documentation 中,它说“委托是一种引用类型,可用于封装命名或匿名方法。委托类似于 C++ 中的函数指针;但是,委托是类型-安全和安全

我的问题是,他们所说的“安全”代表是什么意思?

【问题讨论】:

  • 看起来那部分是由营销部门编写的……它根本不意味着任何东西。安全性在于设计,而不是语言功能。
  • 不是语言功能?当然它也依赖于语言,看看 ADA
  • @BenVoigt 实际上它确实意味着什么。委托不可能指向无效地址,这可能在 C 中发生。因此它们可以安全使用 - 您不会跳入一些随机内存。
  • @TomTom:Wild 委托至少与 Wild 函数指针一样可能。 (可能更有可能,因为当使用带有 p/invoke 的委托时,调用者和被调用者之间不可能进行类型交叉检查)C++ 函数指针是完全安全的,除非你开始强制转换它们(总是一个坏主意),并且委托也会遇到麻烦当你禁用类型系统时。
  • 好吧,很多 C 语言的人不同意你的观点,指针损坏是一个问题,C# 中的不安全块甚至不值得讨论,因为不安全的定义使安全无效。

标签: c# .net security delegates


【解决方案1】:

委托强制对方法进行类型安全调用。这通常通过编译器执行的静态类型检查来工作。但这不是唯一的方法,您可以使用Delegate.DynamicInvoke() 绕过编译器类型检查。一个例子:

using System;

class Program {
    delegate void foo(long arg);
    static void Main(string[] args) {
        var obj = new Example();
        var dlg = Delegate.CreateDelegate(typeof(foo), obj, "Target");
        dlg.DynamicInvoke(42);
    }
}

class Example {
    private long field;
    public void Target(long arg) {
        field = arg;
    }
}

现在开始修改这段代码,你可以做些什么来欺骗类型系统:

  • 更改 foo 委托声明
  • 传递不同的委托类型作为第一个参数
  • 将不同类的对象作为第二个参数传递
  • 更改目标方法名称
  • DynamicInvoke 调用中传递不同类型的参数
  • DynamicInvoke 调用中传递一组不同的参数

所有这些尝试都会毫无怨言地编译。它们都不会执行,你会得到运行时异常。这就是使委托安全的原因,您不能使用它们来调用会使堆栈不平衡的方法或诱导目标方法访问未初始化或不属于激活框架的堆栈位置。恶意软件劫持代码的传统方式。 C 或 C++ 中不存在此类运行时检查,它们的编译器仅执行静态检查,并且可以通过简单的强制转换绕过。

【讨论】:

    【解决方案2】:

    我的问题是,代表“安全”是什么意思?

    使用委托调用的函数会被赋予调用者的安全上下文,这可以防止委托执行未执行的任务 可供低权限调用者使用。 可以初始化委托 带有指向在任何地方实现的函数的指针。唯一的 限制是签名。调用者在调用时需要小心 包含指向未知来源的函数指针的委托,其中有 可能是意想不到的实施。使用代码访问安全性 保护代表。

    信用:http://etutorials.org/Programming/programming+microsoft+visual+c+sharp+2005/Part+III+More+C+Language/Chapter+8+Delegates+and+Events/

    【讨论】:

    • 这解释了如果使用不当,代表会如何引入不安全感。与问题中的主张完全相反。
    • @BenVoigt - 实际上关于 Secure 是正确的。 “委托人被赋予了调用者的安全上下文,这可以防止委托人执行低权限调用者不可用的任务。”这意味着它们是安全的
    • 这与问题中引用的 C++ 没有区别。
    • 我不是说它是,显然,作者不太知道如何措辞这部分。但它确实回答了“我的问题是,他们所说的 delagate 它“安全”是什么意思?”
    【解决方案3】:

    在这种情况下,我认为安全意味着委托不能持有无效值。这可能与类型安全部分有一点重叠。

    【讨论】:

      【解决方案4】:

      这意味着您不能像在 C/C++ 中那样“搞乱”,使函数指针指向无效的内存区域或更糟的是指向恶意代码。

      【讨论】:

        【解决方案5】:

        这是在将它们与 C++ 中的函数指针进行比较,正如那个人所说,它可以用来“炸掉你的腿”。

        【讨论】:

        • C++ 函数指针实际上是非常安全的。你必须做一些非常愚蠢的事情才能得到一个狂野的函数指针(另一方面,数据指针经常遇到删除后使用、泄漏等)
        猜你喜欢
        • 2011-10-15
        • 2013-07-11
        • 1970-01-01
        • 2013-05-28
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2015-06-02
        • 2018-04-29
        相关资源
        最近更新 更多