需要一种安全的方法来绕过公共方法中的许可证检查条件
本文关键字:方法 许可证 条件 检查 一种 安全 | 更新日期: 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
不仅仅是检查许可证,否则如果您希望它而不是检查许可证就没有必要调用它。
下面是你应该如何解决这个问题。
- 通过将
getLicense
方法的一部分提取到一个新方法中,将其一分为二(至少(。将实际检查许可证的部分保留在原始方法中,并将其余部分拆分为新方法。使这个新方法成为internal
- 将此属性添加到您的A项目:
[assembly: InternalsVisibleTo("B")]
- 从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();
}
}