如何保护我的私有函数不被反射执行?

Roy*_*mir 13 .net c# reflection

看到这个之后:访问修饰符也会影响反射吗?

我尝试使用它,但它不起作用: 在此输入图像描述

如何防止反射执行我的私有方法?

Mar*_*ell 27

如果某人当前可以对您的私人方法使用反射,那么他们已经有足够的权限来回避您放置的任何其他方式.以较少的信任运行可能是一种选择,但这只是为了防止插件之类的东西具有太多的访问权限 - 它不会阻止具有(例如)管理员访问权限的用户,该用户可以简单地提升访问权限.

如果您不希望代码运行,请不要将其置于恶意用户的物理范围内; 保持网络服务或类似.用户可用的任何代码都可以直接使用,也可以通过反编译间接使用(如果需要,可以对其进行反混淆处理).你可以使用一些技巧来阻止他们(通过堆栈跟踪检查调用者等),但这不会阻止某人确定.


Eri*_*ert 24

如何保护我的私有函数不被反射执行?

您可以更改安全策略,以便代码在运行时无权执行"私有反射".

当然,这只会影响您的机器.如果您想影响其他人的计算机,请向其计算机管理员发送电子邮件,并要求管理员更改用户的安全策略,以使其无权进行"私人反映".那是拥有机器及其运行的网络的人; 显然,您无法更改您不拥有的网络上的安全设置.

当然注意,必须限制比私人反射更强大的权利.设置一个政策说没有好处,例如"私人反映权被拒绝,但授予改变安全政策的权利".然后,用户可以只更改安全策略以重新授予对自己的私有反射.

您还必须限制访问磁盘的能力.可以访问磁盘的人可以简单地从程序集中读取代码,将私有元数据更改为public,并正常加载程序集.

因此,您的任务是说服全世界的所有机器管理员不允许其用户访问自己的磁盘.我怀疑你会不会成功; 我建议您找到一种不同的方法来保护您的功能免受滥用.


Zei*_*kki 21

这是一个迟到的答案,但我认为这是一个更新,因为所有答案都是在2015年中期发布.NET 4.6之前编写的,它引入了一个名为DisablePrivateReflection的新程序集属性.

通过在您的标记中标记该属性AssemblyInfo.cs,您可以禁用对该程序集的私有成员的反射.

例:

namespace DisablingPrivateReflection
{
    public class Singleton
    {
        private Singleton()
        {

        }
    }
}
Run Code Online (Sandbox Code Playgroud)

在你AssemblyInfo.cs添加这一行:

[assembly: DisablePrivateReflection]
Run Code Online (Sandbox Code Playgroud)

然后在引用上述程序集的客户端程序集中,此代码将在运行时失败:

var singleton = Activator.CreateInstance(typeof(Singleton), true);
Run Code Online (Sandbox Code Playgroud)

抛出的异常是MethodAccessException类型,带有消息:

通过方法'Program.Main(System.String [])'尝试访问方法'DisablingPrivateReflection.Singleton..ctor()'失败.


Hei*_*nzi 8

访问修饰符不是安全机制.

如果,如果你能阻止通过反射调用你的功能,用户可以直接反编译程序,提取功能,把它放在一个新的组件,并执行它.