如何确保只能从特定的dll调用方法

时间:2015-01-12 15:36:10

标签: .net security design-patterns code-security

我需要准备我的数据库进行单元测试,因此在设置方法中我想摆脱数据。

但是,我不想成为其他任何人,但单元测试dll能够调用我的数据访问层中的DeleteAllData()方法。可以做些什么?

5 个答案:

答案 0 :(得分:3)

虽然其他人已经建议如何限制代码调用您的方法,但它们不会创建安全边界并且可能被欺骗(除非您对两个程序集进行签名并验证证据)。

在您的业务逻辑中使用名为DeleteAllData的方法对我来说听起来很可怕。如果此方法仅用于单元测试,我可能会将其移至单元测试组件。如果那是不可能的,我至少会把代码放在compiler directive中,只能在调试模式下编译。

答案 1 :(得分:1)

您可以对两个程序集进行签名,然后使用InternalsVisibleTo属性使单元测试程序集成为唯一能够查看internal的程序集。您需要创建您只想公开给单元测试项目的所有方法,属性和类internal

InternalsVisibleToAttribute上的MSDN:

  

指定仅在当前程序集中通常可见的类型对指定程序集可见。

答案 2 :(得分:1)

您可以在DeleteAllData()方法中使用Assembly.GetCallingAssembly()interrogation of the call stack的组合,以确保您的方法仅由您期望的方法调用。

您可能需要prevent the jitter inlining your method calls以确保在访问DeleteAllData()方法时保留调用汇编方法和调用堆栈。

调用堆栈可能已足够,但也可能需要调用程序集。

我没试过这个,但认为它应该在理论上有用。

答案 3 :(得分:0)

使用internal关键字标记。来自MSDN docs

  

internal关键字是类型和类型成员的访问修饰符。内部类型或成员只能在同一程序集中的文件中访问

答案 4 :(得分:0)

我还有一种方法可以实现问题中提到的事情。

如果您正在使用VSTS单元测试。

将该方法设置为类中的私有,以便其他类和程序集无法访问它。

现在从Unit测试中调用私有方法使用PrivateObject

以下是PrivateObject的Microsoft文档: - link

如何使用私人对象: - link