需要一种安全的方法来绕过公共方法中的许可证检查条件

本文关键字:方法 许可证 条件 检查 一种 安全 | 更新日期: 2023-09-27 18:06:20

我有两个产品A和B。A是付费工具,B是免费工具。B使用A的一些dll。现在我有一个方法说

 public void licenseCheck(bool test){....} 

此方法包含一个条件,如果您没有"获取许可证",则会发出警报。现在,从产品B的一个类中,出于某种原因,我不得不调用licenseCheck方法,因为B是免费的,你不需要许可证,它仍然会给出"获取许可证"错误。

我试着更改了方法的签名

licenseCheck( bool test, bool byPasslicense = false)

并使用byPasslicense变量来绕过许可证检查的条件。我给它指定了默认值,因为这种方法在很多地方都使用。这种方法存在一些安全问题,因为这些dll用于许多其他需要许可的付费产品。有些人可以直接调用这个方法,并将"true"值传递给licenseCheck方法的byPasslicense参数。我不想那样。我只想让它绕过产品B

注意:这是一个完成的项目,我不能只是改变整个方法,我只需要绕过licenseCheck方法中负责许可证检查的条件

需要一种安全的方法来绕过公共方法中的许可证检查条件

在我看来,您违反了SOLID原则中的S,因为方法getLicense不仅仅是检查许可证,否则如果您希望它而不是检查许可证就没有必要调用它。

下面是你应该如何解决这个问题。

  1. 通过将getLicense方法的一部分提取到一个新方法中,将其一分为二(至少(。将实际检查许可证的部分保留在原始方法中,并将其余部分拆分为新方法。使这个新方法成为internal
  2. 将此属性添加到您的A项目:[assembly: InternalsVisibleTo("B")]
  3. 从B调用新方法,而不是getLicense,从而绕过许可证检查

请注意,internal方法只能从同一个程序集(在本例中为A(中访问,或者从A明确表示内部对其可见的程序集(如本例中的B(中访问。第三方开发人员将无法直接访问该方法。


示例

原始类别:

public class Dohickey
{
    public void getLicense(bool hasLicense)
    {
        if (!hasLicense) throw new Exception("Ewups");
        SetSomethingThatOtherCodeDependsOn();
        SetSomethingElseAsWell();
    }
}

修复后:

[assembly: InternalsVisibleTo("B")]
// ...
public class Dohickey
{
    public void getLicense(bool hasLicense)
    {
        if (!hasLicense) throw new Exception("Ewups");
        SetThings();
    }
    internal void SetThings()
    {
        SetSomethingThatOtherCodeDependsOn();
        SetSomethingElseAsWell();
    }
}