代码之家  ›  专栏  ›  技术社区  ›  Jerome Cance

安全问题:如何保护从客户端返回到服务器的Hibernate集合?

  •  1
  • Jerome Cance  · 技术社区  · 16 年前

    我有一个名为“parent”的简单pojo,其中包含一个对象“child”的集合。

    在hibernate/jpa中,它只是一对多的关联,子对象不知道其父对象:这些子对象可以有不同类型的父对象,因此更容易不知道父对象(想想表示标记的子对象,父对象可以是具有标记的不同对象类型)。

    现在,我将父对象发送到我的网站的客户端视图,以允许用户修改它。

    对于它,我使用hibernate/gwt/gilead。

    我的用户做了一些更改,然后单击“保存”按钮(Ajax),它将我的父对象发送到服务器。父对象的字段已被修改,但更重要的是,集合中的某些子对象已被添加或删除。

    总之,当父对象返回到服务器时,它的集合中现在有: -ID为空且需要保持的新“子”对象 -修改了id不为空且需要合并的“子”对象 -可能被黑客攻击的“子”对象,其中ID不为空,但最初不是由父对象拥有 -缺少子对象(已删除):需要删除

    如何保存父对象(及其集合)?是否从数据库加载父集合以比较修改后的集合的每个对象,以查看是否没有被黑客攻击的项? 是否清除旧集合(删除孤立项)并重新添加新子集合(但有一些子集合尚未修改)?

    谢谢

    附言:对不起,我的英语,希望你理解这个概念;)

    2 回复  |  直到 16 年前
        1
  •  1
  •   Simon    16 年前

    您的堆栈中的某些东西必须提供您正在讨论的逻辑,并且考虑到您的情况,它可能是您自己。您必须通过从数据源中读取来获取对象的当前持久化状态,以便进行比较。请记住,如果几个合法操作可以同时更新父对象及其集合,则必须非常注意定义事务粒度和代码的线程安全性。

    这不是一个简单的问题,任何方式,可能有框架功能可以帮助,但我还没有找到解决这一问题的任何现实世界的实现,特别是在我有逻辑,试图区分合法和“黑客”数据。

    您可以考虑修改架构,以便父级和子级在单独的操作中持久化。在您的情况下,这可能不合适,但您可能能够通过拆分持久性操作并提供面向儿童的安全性来获得更精细的事务处理,从而使您的黑客问题更易于管理。

    祝你好运。我建议您在编写太多代码之前,先绘制一个详细的逻辑流程图。

        2
  •  0
  •   Jerome Cance    16 年前

    我找到的最佳解决方案是管理手动创建的DTO。DTO只向客户机发送所需的数据。对于要在只读模式下设置的每个字段,我将根据我用DTO发送给客户机的密钥计算签名。

    当我的DTO返回服务器时,我检查签名以确保我的只读字段没有更改(用返回字段重新计算签名,并将其与返回DTO的签名进行比较)

    它允许我指定只读字段,并确保我的对象没有被黑客攻击。