Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/293.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 在C语言中避免用户代码调用反射#_C#_Reflection_Code Security - Fatal编程技术网

C# 在C语言中避免用户代码调用反射#

C# 在C语言中避免用户代码调用反射#,c#,reflection,code-security,C#,Reflection,Code Security,我正在为我目前教授的课程实施一个自动“评估器”。总的想法是,每个学生都提供一个DLL,并实现一些算法。我的evaluator使用反射加载所有这些DLL,查找学生实现并在锦标赛中对它们进行评估。所有这些算法都是黑盒优化器,它们实现了以下接口 public interface IContinuousMetaheuristic { // ... Some unimportant properties Vector Evaluate(Function function, int maxE

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

public interface IContinuousMetaheuristic
{
    // ... Some unimportant properties
    Vector Evaluate(Function function, int maxEvaluations, ...);
}
函数
(至少是相关部分)的类定义为:

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

因此,一般的问题是:是否有任何方法禁止在我动态加载的代码中使用反射,或者在任何其他意义上禁止该代码访问私有字段(欺骗)


提前感谢。

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


对于.Net 4,你读过MSDN吗?

他们给你源代码了吗?编写一个单独的工具,在源代码中查找“usingsystem.Reflection”和“System.Reflection.”。如果他们想出了一个聪明的办法来避免这种情况,也许他们应该得到通过作弊获得的额外分数

另外,在他们使用的代码中,这又是什么呢

private double FakeOptimumPointWithAConvincingName{ get { return 12.07; } }
然后在运行evaluator时将其更改为:

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

沿着这条路线还有很多其他聪明的事情要做;关键是你可以用诡计而不是技术来阻止他们。如果他们能想出更好的把戏,那就值得称赞。:)

如果您在需要时从配置文件加载最佳值,则很难在该时间之前反映它们

最佳点是否必须在
函数
类中,或者你能不能把它存储在你给学生的参考dll中没有的另一个数据结构中?把向量求值函数与最佳值解耦不是更简单吗?如果你只给他们一个
Func
,他们将很难窃取最佳答案。还有可能复制
Function
远程代理。我认为防止这种欺骗的最简单、最简单的方法是要求你的学生提供源代码,这样你就可以检查它是否有任何反映(查找
typeof(T)
GetType()
)。我已将
[SecurityCritical]放入
属性位于私有字段顶部,但它仍然不起作用。我不想看源代码。不过我喜欢伪造代码,只是因为每当我需要给他们评估器时,我需要不断地来回更改代码,以便他们可以进行培训。无论如何,你都会因为我的聪明得到我的支持。谢谢。你没有但要继续重建,您只需使用不同的版本。如果您不想让他们完全访问您的代码,您应该给他们一些稍微不同的内容。我喜欢两个不同的版本选项。我想我会坚持这种方法,因为我的时间不多了。感谢@tallseth和其他人的支持有用的答案。但问题是,在计算用户代码中的函数时,该值已经加载,然后它们可以在特定时间反映该值。如果使变量加载变慢,则不会。这意味着仅在代码需要它们之前检索它们,并且在使用它们后立即将值归零。在在这种情况下,他们可以反映的窗口将非常短。你是对的@IvoTops。这可能是个好主意。但我不太确定如何避免他们像我一样做:加载配置文件。如果配置路径是固定的,那么是小菜一碟,如果它被存储,他们可以反映它,等等。
private double FakeOptimumPointWithAConvincingName{ get { throw new SomeoneCheatedException(); } }