避免用户代码调用C#中的Reflection

时间:2012-06-22 12:34:57

标签: c# reflection code-security

我正在为我正在教授的课程实施一个自动“评估员”。总的想法是每个学生都提供了一些DLL,并实现了一些算法。我的评估者使用Reflection加载所有这些DLL,找到学生实现并在锦标赛中评估它们。所有这些算法都是黑盒优化器,它们实现了以下接口

public interface IContinuousMetaheuristic
{
    // ... Some unimportant properties
    Vector Evaluate(Function function, int maxEvaluations, ...);
}

Function的类定义(至少是相关部分)是:

public class Function:
{
    private Vector xopt; // The optimum point
    private double fopt; // The optimum value

    public double Evaluate(Vector x);
}

如您所见,我需要将Function实例传递给这些元启发式。这些功能由我自己实现。其中大多数在某种意义上是随机的,也就是说,我在函数构造函数中选择一个随机最优点。这就是为什么你可以在课堂上看到xopt字段的原因。问题是,我不希望我的学生能够通过Reflection或任何其他技术访问xoptfopt字段,因为这会欺骗,或者至少会发现他们是否这样做我可以相应地惩罚他们;)。

所以,一般的问题是:有没有办法不允许在我动态加载的代码中使用Reflection,或者在任何其他意义上禁止此代码访问私有字段(作弊)。

提前致谢。

3 个答案:

答案 0 :(得分:2)

他们会给你源代码吗?编写一个单独的工具,找到“using System.Reflection”和“System.Reflection”。在源头。如果他们想出一个聪明的伎俩来避免这种情况,也许他们应该得到欺骗所带来的额外分数。 :)

此外,他们使用的代码中有这个:

private double FakeOptimumPointWithAConvincingName{ get { return 12.07; } }

然后在运行评估程序时将其更改为:

private double FakeOptimumPointWithAConvincingName{ get { throw new SomeoneCheatedException(); } }

在这条线上还有许多其他聪明的事情要做;重点是你可以使用技巧而不是技术来挫败它们。如果他们想出更好的技巧,那就值得称赞。 :)

答案 1 :(得分:1)

简短的回答是,只要调用者完全信任,直到.Net 4.0(see this如何创建沙盒应用程序到.Net.3.5),你就无法避免私有或内部的反射发现方法

对于.Net 4,您是否在MSDN上阅读了Security Considerations for Reflection for .Net 4.0

答案 2 :(得分:1)

如果您在需要时从配置文件中加载最佳值,那么在此之前很难反映它们