Struts2严重的安全问题?

Struts2严重的安全问题?,struts2,struts2-spring-plugin,Struts2,Struts2 Spring Plugin,我正在使用struts2、hibernate和spring,并使用模型驱动模式。当试图同时获取具有两个不同用户和会话(也是不同计算机)的对象时,似乎存在严重问题 更多信息。。。 假设我们有一个项目对象,它有两个成员-user和name。 两个用户都将尝试获取他们的项目对象(当然,对于不同的用户,这是一个不同的对象)。因此,用户A将有一个id为498的项目,用户B将有一个id为499的项目 struts操作将识别出他们试图获取具有不同ID的对象,但似乎两个用户都有相同的项目对象实例,因此他们看到的

我正在使用struts2、hibernate和spring,并使用模型驱动模式。当试图同时获取具有两个不同用户和会话(也是不同计算机)的对象时,似乎存在严重问题

更多信息。。。 假设我们有一个项目对象,它有两个成员-user和name。 两个用户都将尝试获取他们的项目对象(当然,对于不同的用户,这是一个不同的对象)。因此,用户A将有一个id为498的项目,用户B将有一个id为499的项目

struts操作将识别出他们试图获取具有不同ID的对象,但似乎两个用户都有相同的项目对象实例,因此他们看到的结果相同。 您可以在此处提供的日志中看到:

2011-12-08 14:07:21登录接收者[INFO]用户17正在调用populateProject,参数:id=499 2011-12-08 14:07:21登录接收者[INFO]用户4正在调用populateProject,参数:id=498 2011-12-08 14:07:21项目行动[信息]Obj:hbn。Project@e2df60d,会话用户Id为17,obj.User.Id为4 2011-12-08 14:07:21项目行动[信息]Obj:hbn。Project@e2df60d,会话用户Id为4,obj.User.Id为4

我该怎么解决呢

谢谢,
Ron。

根据我们的讨论,我正在发布问题的原因和解决方案。 没有为spring插件创建的操作设置作用域,默认情况下,它们的作用域为
singleton
。 在struts2中,每个动作还可以作为域对象使用,因此struts2始终为每个请求创建一个动作的新实例,并将其放在值堆栈上

在上述情况下,作用域为
singleton
,这是问题的原因,因为由于
singleton作用域
,两个用户都有相同的动作对象通过spring传递。设置
scope=prototype
解决了问题

有关更多详细信息,请参阅官方插件页面


根据我们的讨论,我将公布问题的原因和解决方案。 没有为spring插件创建的操作设置作用域,默认情况下,它们的作用域为
singleton
。 在struts2中,每个动作还可以作为域对象使用,因此struts2始终为每个请求创建一个动作的新实例,并将其放在值堆栈上

在上述情况下,作用域为
singleton
,这是问题的原因,因为由于
singleton作用域
,两个用户都有相同的动作对象通过spring传递。设置
scope=prototype
解决了问题

有关更多详细信息,请参阅官方插件页面


如何创建struts2操作的实例??您是否正在使用struts2 spring插件,如果是,请显示您正在创建动作实例的spring文件?是的,我使用struts2 spring插件。我有一个单独的spring配置文件用于每个操作(或其中的大多数操作)。这是ProjectBeans.xml中的内容。您可以显示任何spring配置文件,以及您为操作定义的范围吗?这是spring配置文件中启动操作的部分…我不确定应该查看哪个范围,在哪里?这是struts.xml jsp/Project/form.jsp/Project/list.jsp/Project/details.jsp/Project/showReport.jsp的一部分=“projectAction这个
projectAction
类必须由spring在其他一些文件中初始化。您可以显示您创建bean的条目,如
如何创建struts2 action的实例吗??您是否正在使用struts2 spring插件,如果是,请显示您正在创建动作实例的spring文件?是的,我使用struts2 spring插件。我有一个单独的spring配置文件用于每个操作(或其中的大多数操作)。这是ProjectBeans.xml中的内容。您可以显示任何spring配置文件,以及您为操作定义的范围吗?这是spring配置文件中启动操作的部分…我不确定应该查看哪个范围,在哪里?这是struts.xml jsp/Project/form.jsp/Project/list.jsp/Project/details.jsp/Project/showReport.jsp的一部分=“projectAction这个
projectAction
类必须由spring在其他文件中初始化。顺便问一下,您可以显示您创建了类似于
的bean的条目吗?在会话中存储从DB获取的对象是否更好?因为根据我在这里的理解,每个标签都会创建一个新的操作实例(需要访问getObj方法),我建议您为此创建一个新问题。但是不需要将每个对象都放入会话中,因为struts2是开箱即用的创建值堆栈,并将请求对象放在那里,这样就可以从中访问,在会话中存储从DB获取的对象是否更好?因为根据我在这里的理解,每个标记都会创建一个新的操作实例(需要访问getObj方法),我建议您为此创建一个新问题。但是不需要将每个对象都放入会话中,因为struts2是开箱即用的创建值堆栈,并将请求对象放在那里,以便可以从那里访问