【问题标题】:For security purposes, is there a way to make code fail if it's written a certain way?出于安全目的,如果以某种方式编写代码,是否有办法使代码失败?
【发布时间】:2014-08-21 23:36:26
【问题描述】:

我在一个项目中使用 JPA 和 Maven。编写执行此操作的代码是可能的,但在语义上是错误的:

entityManager.find(EntityWithRestrictedData.class, key);

entityManager.findAll(EntityWithRestrictedData.class);

该项目已经有应该使用的代码:

getEntityWithRestrictedDataONLYIfYouHaveAccess(key, user);

如果有人使用实体管理器直接查找受限数据,有什么方法会导致构建失败?

请记住,在我的项目中,使用findfindAll 有其他完全正当的理由,只是不使用EntityWithRestrictedData

编辑:这个问题可能与此重复,How to make a maven build fail if source code contains a keyword / regex

【问题讨论】:

  • 将 EntityWithRestrictedData 放入受保护的包中,使其构造函数受到保护并将其包装在 Builder 或 Factory 周围。
  • @AlexandreSantos 我感觉 JPA 会适应这种情况
  • 我不确定是否通过 Maven,但您可能需要自定义 FindBugs 或 Sonar 规则。
  • 我什至不确定您将如何定义禁止调用的外观。这是 AOP 通常更可取的事情,和/或您不应该直接在安全边界之外的代码中使用 EntityManager

标签: java maven jpa


【解决方案1】:

我认为 Alexandre 在他的评论中建议的方法将是正确的方法,通过消除过程进行推理。这是我的想法。

候选方法:(1) 静态分析,(2) 编译时执行,(3) 运行时执行。在这三个中,我认为只有(2)在这里是可行的。

静态分析:静态分析是行不通的,因为人们总是可以做类似的事情

ReflectionUtils.invoke(
        myEM,
        myFindAllMethod,
        Class.forName("x.y.EntityWithRestrictedDat" + "apple".substring(0, 1)));

运行时强制:此外,运行时强制似乎也不可行,因为必须有一个单元测试来执行有问题的代码并使用适当的调用拒绝模拟。我认为你不能强迫那些事情。

编译时强制:这样就剩下编译时强制了。 The compiler performs various security checks,但是(我认为)这里唯一相关的是可见性检查。因此,您必须使被调用的类、被调用的方法或传递的类不能用于一般用途。您无法控制 EntityManagerfindAll() 的可见性。所以剩下的唯一事情就是按照 Alexandre 建议的方式使 EntityWithRestrictedData 不可用。强制与此实体的交互发生在服务之后。

在这种情况下,我很高兴听到忽略了一种可能性。

【讨论】:

  • ReflectionUtils 的例子是正确的,但我不介意这样的极端情况。
  • 还有更多良性案例仍然难以通过静态分析来捕捉,例如 entityManager.findAll(requestedClass)。话虽如此,您当然可以使用静态分析来标记 entityManager.findAll(EntityWithRestrictedData.class),这对于您的目的来说可能已经足够了。
猜你喜欢
  • 2023-04-04
  • 2018-11-28
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2020-03-11
  • 2014-05-11
  • 1970-01-01
  • 2021-03-08
相关资源
最近更新 更多