这个问题有些与JPA有关,但它更多的是关于方法而不是技术,所以希望有人能够提供建议。
我正在使用Spring MVC和Hibernate为一个允许用户创建产品和产品描述的网站提供支持。我有一个Product实体,它与ProductDescription具有双向的一对多关系。
如果在提交绑定到Product实例的表单并指定其所有ProductDescriptions时,恶意用户可能会输入ProductDescriptions的伪造ID并“劫持”其他用户的数据。对此的一个解决方案是始终重新创建ProductDescriptions,因此在提交表单时删除它们,并且每次都创建新的表单。这似乎效率低下,因为每次更新产品时都需要额外的删除和写入操作(即使ProductDesciptions没有更改)。
另一种选择是在运行更新之前检查子实体的“所有权”。
其他人如何解决这个问题?大多数人是否会删除/插入或选择性更新?
以下是我正在讨论的POST提交类型的示例:
id=1
name=My Product
descriptions[0].id=123
descriptions[0].text=A lovely description of my product
descriptions[0].price=100
descriptions[1].id=123
descriptions[1].text=Another lovely description of my product in another language
descriptions[1].price=50
我正在谈论的那种课程的一个例子:
public class Product
{
@Id
@GeneratedValue(strategy = GenerationType.AUTO)
private Integer id;
@OneToMany(mappedBy = "product")
private Set<ProductDescription> descriptions;
private String name;
}
public class ProductDescription
{
@Id
@GeneratedValue(strategy = GenerationType.AUTO)
private Integer id;
private Integer price;
@ManyToOne
private Product product;
private String text;
}
答案 0 :(得分:2)
您是否考虑过使用数据传输对象(DTO)?这样你就可以将DTO而不是实体对象传递给中间层,在那里你可以执行几次检查。
答案 1 :(得分:2)
如果您倾向于为您的应用程序添加安全性,我建议使用spring security,如果用户是该产品的所有者,您可以在更新它的值之前检查servlet。
这就是我们到目前为止所做的工作。在服务器端检查时浪费了一点资源但是使用post,只有高级用户可以通过更改响应头来尝试,所以我不认为它发生了很多。
如果没有安全性,您可以尝试使用会话来验证用户,但问题是如果会话消失,则无人可以更改产品。
干杯