【问题标题】:How can I prevent a third party from calling certain methods?如何防止第三方调用某些方法?
【发布时间】:2012-02-15 14:27:08
【问题描述】:

我有一个正在开发的程序集,用于围绕一些潜在的敏感功能创建一个外观,我希望允许第三方调用其中包含的一些方法,但不能调用其他方法。

如果第三方可以访问整个 DLL,我如何防止他们调用未经授权的方法(我不担心他们会看到代码,只是执行它)?

这必须与 .net 紧凑框架兼容,因此很遗憾,无法使用 StrongNameIdentityPermission 属性。

【问题讨论】:

  • 你能不能把敏感方法放在内部? (诚​​然,这并不能阻止反思……但那是另一回事。)
  • 我一定是遗漏了一些东西,你想阻止调用 Facade API 的公共成员还是底层 DLL 的公共成员?
  • 宏伟计划是使用内部程序集将所有逻辑封装在一个地方——我们需要调用我们不希望第三方调用的方法。痛苦的替代方案是另一个带有精简方法子集的程序集,但这是一个令人生畏的想法。
  • @Jon 我也在想同样的事情,加上混淆。
  • @AntSwift:您可以在自己组织的程序集中使用 InternalsVisibleTo 吗? (请注意,委托到完整版本的精简版本将允许使用更细粒度的方法。然后“LibraryForInternalUse”将授予对“LibraryForThirdPartyUse”内部方法的访问权限,后者将公开委托一些方法。)

标签: c# .net compact-framework encapsulation


【解决方案1】:

我认为你应该发布两个 Facade 实现,一个用于“内部”消费者,它公开所有方法,另一个用于只公开子集的外部。您可以通过两个独立的构建过程来实现这一点,同时只维护一个代码库。想到的一种技术是使用compiler directives 从外部构建中排除一个方法,或者如果其他公共方法需要它,则将其标记为内部。如果您确实使用内部修饰符发布敏感方法,您可能还需要实现混淆。

编辑

也许它会更简洁,而不是在每个方法周围都有指令来使用部分类,为敏感方法定义一个部分类并将整个类实现放在一个指令中。

    public partial class MyClass
    {
        public void NonSensitive(){}
    }

    #if INTERNAL_BUILD
    public partial class MyClass
    {
        public void Sensitive(){}
    }
    #endif

您可以将此部分类放在同一个文件或单独的文件中,这可能是一个很好的分离级别,因为您可以在文件名 x_Sensitive.cs 或类似文件前添加。

【讨论】:

  • 这是一个干净的解决方案。我正在寻找一种将其集成到构建过程中的方法。
  • 虽然有点乱,但效果很好。我们只需要偶尔构建限制版本,所以我很高兴现在手动设置条件符号。
【解决方案2】:

说明

假设我理解你的问题。

您可以使用internal 访问修饰符标记您的方法,以使它们不 可从其他库访问。

但这从安全角度来说并没有帮助,因为总是可以使用反射来运行该方法。

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

更多信息

【讨论】:

  • 从安全角度来看,这并不能阻止调用这些方法,除非对反射的使用也施加了限制。
  • 是的,我知道,但我不知道我一开始是否理解这个问题。我的答案是扩展的。谢谢!
【解决方案3】:

如果第三方可以看到代码,那么他们就可以运行它 - 您无需采取任何措施来阻止它。

请注意,但是您有一个正在加载 3rd 方插件的应用程序,那么您可以加载插件程序集,但有限制阻止它使用反射 - 这意味着您可以将这些方法/类标记为 internal 以防止插件被在您的应用程序中作为插件加载时可以调用这些方法。根据敏感功能的性质,从安全角度来看,这可能对您有用,也可能没用。

有关如何执行此操作的信息,请参阅How to: Run Partially Trusted Code in a Sandbox

【讨论】:

  • 这不是真的,使用 StrongNameIdentityPermissionAttribute,我可以确保只有使用我们的密钥签名的代码才能调用“受保护”代码。
  • @Jusin “如果第三方可以看到代码,那么他们就可以运行它——你无法阻止它。”如果第三方试图运行受保护的代码,则会生成 SecurityException。 morganskinner.com/Articles/StrongNameIdentityPermission
  • @AntSwift 我的观点是,如果他们可以看到代码,那么他们就可以反映它,将其重新编译为缺少给定 StrongNameIdentityPermission 属性的程序集,然后运行该程序集 - 你需要考虑到这一点,以确保您的应用程序安全。
  • 接下来,我的理解是重新编译的程序集将不再签名。然后第三方需要签署新的程序集,以便我签署的程序集接受它。对吗?
  • @AntSwift 是的 - 一般来说,他们需要重新签署程序集才能让您的应用程序接受它。如果您控制流程,您就可以控制在该流程中运行的内容。
【解决方案4】:

您能否提供您希望第三方作为 Web API 使用的功能?他们将无权访问源代码或编译的二进制文件。他们只能准确地看到您希望他们看到的内容。这还将提供额外的安全功能,例如调用者的身份验证和授权。

【讨论】:

    猜你喜欢
    • 2011-04-15
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2022-11-26
    • 2012-01-15
    • 1970-01-01
    • 1970-01-01
    • 2015-05-26
    相关资源
    最近更新 更多