正如标题所说:在C#中使用和/或传递匿名方法(Action<>
,Func<>
)时需要考虑的安全含义是什么?
接受Action<>
/ Func<>
的方法似乎是将外部代码注入程序的潜在方式。为了记录,我理解注入的方法或函数不能在任意内存访问的意义上做本质上不安全的事情,但我认为它可以允许调用代码调用例如任意.Net框架功能,损坏的数据,或以其他方式导致应用程序行为不端。
这个假设是错的吗?
如果不是,应该怎么做才能锁定这些?另外,有没有办法验证传递给方法或函数的
/ Func<>
以确保它是一个预期的形式或限制它对某些类型和命名空间的访问?
另外,请原谅我,如果我没有使用正确的术语,我还在学习。
答案 0 :(得分:9)
接受Action&lt;&gt; / Func&lt;&gt;的方法似乎是将外国代码注入程序的潜在方式
这是完全错误的。无论是谁调用你的函数并传递一个委托,根据定义,已经在你的程序中运行代码了 传递委托的任何代码都可以做任何想做的事情。您不能在同一AppDomain中拥有安全边界。 (旧版本的.Net有代码访问安全性,试图这样做,但不是一个好主意)
但是,它可能会产生意外的重入,这可能会导致线程安全的代码出现问题。
答案 1 :(得分:2)
我真的在问是情景
当CAS策略仍在使用时(例如,中等信任ASP.NET),当存在堆栈断言时,受信任的代码段无法安全地调用不受信任的代码。例如
时new SecurityPermission(Unrestricted).Assert()
实际上是安全检查堆栈步骤将在此时停止。这可能导致无法检测到不受信任的代码。 See the docs for Assert.
我在这里有点模糊,因为这种情况很难实现,而且已经过时了。
如果同一进程内部没有信任边界,即使没有在某处注入代码,调用者也已具备所有功能。没必要。