我有类似的域名模型
@OneToMany(targetEntity=adv.domain.City.class...)
@OneToMany(targetEntity=adv.domain.Distinct.class)
我的目标是在用户按下浏览器中的删除按钮时删除不同的内容。在该控制器获得不同的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 ..
谢谢
答案 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()