如何防止未经授权的用户删除我的域模型中的对象?

时间:2010-06-05 19:30:47

标签: java hibernate spring orm sql-injection

我有类似的域名模型

  • 1)用户。每个用户都有很多城市。 @OneToMany(targetEntity=adv.domain.City.class...)
  • 2)城市。每个城市都有很多地区@OneToMany(targetEntity=adv.domain.Distinct.class)
  • 3)Distintc

我的目标是在用户按下浏览器中的删除按钮时删除不同的内容。在该控制器获得不同的id并将其传递给业务层。其中DistinctService.deleteDistinct(Long distinctId)方法应该委托deliting DAO层。

所以我的问题是在哪里放置安全限制以及实现它的最佳方法是什么。我想确定我删除了真实用户的不同,即城市的真正所有者,而城市是不同的真正所有者。 因此没有人可以使用像localhost / deleteDistinct / 5这样的简单网址来删除所有者。

我可以在我的控制器中从httpSession获取用户并将其传递给商务层。

之后,我可以获得该用户的所有城市并对其进行评估以确保,即citie.id == distinct.city_id,然后删除不同。

但在我看来这是相当荒谬的。

我也可以像这样编写SQL查询......

delete from 
  t_distinct 
where 
  t_distinct.city_id in (
    select 
      t_city.id 
     from 
       t_city 
       left join t_user on t_user.id = t_city.owner_id 
     where 
       t_user.id = ?
  ) 
  and t_distinct.id = ?

那么添加这样的限制的最佳做法是什么。

我正在使用Hibernate,Spring,Spring MVC ..

谢谢

4 个答案:

答案 0 :(得分:5)

您要求的不是SQL注入预防。您需要确保尝试删除的用户已获得授权。

只要您检查访问该页面的用户是否有权删除您尝试删除的行(这将在业务层中检查),并且只有在用户经过身份验证和授权后才允许删除命令执行动作。

答案 1 :(得分:4)

使用hibernate,你不必担心sql注入。它总是使用预备语句,因此您是安全的。

至于你的具体情况,这不是一个SQL注入。但要防止它,请在控制器中进行验证 - 当前记录的用户是否拥有所需的ID。

根据应用程序的大小,您可以实施一些具有所有权设置的常规安全方案,并应用它(使用AOP)。

答案 2 :(得分:0)

我明白我想确定,用户是Book的真正所有者问题是如何实现它。是的,我知道用户已经过身份验证和授权。但另一位授权用户可以轻松删除其他用户的页面。

这可以这样做......

用户userFromHttpSession ... long bookId =加载页面,获取bookId,加载book,获取bookId

列出books = userFromHttpSession.getBooks(); ...迭代书籍,找出book.id == bookId之一 ...然后,如果图书所有者是httpSession的所有者,则继续删除

这就像是太多的SQL查询,而且代码太多,可能还有更好的解决方案。无论如何,谢谢你的答案

答案 3 :(得分:-3)

在将它放入SQL语句之前,只需使用你的head,quote-escape *来自外部(或内部)的所有内容,并在数据进入时检查数据。或者,使用预准备语句。

*编辑:通过“quote-escape”我的意思是像PHP mysql_escape_string()

这样的函数