2015-07-11 83 views
2

由于某些原因,我需要创建一个带有两个提交按钮的表单,这些按钮将在提交后调用不同的操作。多个提交按钮安全风险

我发现https://struts.apache.org/docs/multiple-submit-buttons.html

<s:form method="post" action="mySubmitAction"> 
    <s:submit value="Submit"/> 
    <s:submit value="Clear" action="myClearAction"/> 
</form> 

由于我的项目是用struts 2.3.16.3下面的例子中,struts.mapper.action.prefix.enabled = true是必要的。

但是,是否有任何风险让它回到struts 2.3.16.3? 它会在2.3.15.2中共享相同的安全问题吗?

如果是,你是否介意提供一些替代方案来使多个提交按钮在单一表单上工作? if-else解决方案不是首选。

+0

您可以使用javascript来处理多个按钮,并将您的数据引导至类似的动作。这是更多的工作,然后使用struts.xml。就安全问题而言:您能否对安全问题更具体? –

+0

安全问题在[https://struts.apache.org/docs/s2-018.html](https://struts.apache.org/docs/s2-018.html)中说明。在2.3.15.3之前的Struts 2中使用'action:'前缀时,在某些情况下,这可以用来绕过安全约束。 –

+0

要为多个按钮使用JavaScript,你的意思是触发onclick事件并动态更改动作名称?或者你的意思是使用ajax来调用它? –

回答

1

在版本为Struts 2.0.0 - 与OGNL注入攻击相关的Struts 2.3.15.2中发现的漏洞。事实上,前缀action:为这类攻击打开了一扇门。

以前它在S2-016中被发现,固定版本是2.3.15.1。最近S2-018被引入,他们禁用了action:前缀。推荐升级为2.3.15.3

这意味着使用action:前缀是不鼓励的,您可以启用自己的风险。在S2-019 DMI默认情况下也被禁用,所以你不能使用method:前缀,因为它只有在启用了DMI的情况下才起作用。

这些限制在多个键的使用方法制成的副作用,其中用于s:submit按钮结合比在s:form action属性以外的动作actionmethod属性。要使用多个按钮来执行它自己的操作类的方法,您可以传递一个包含方法名称的参数。它可以是隐藏字段或提交字段等。

execute方法被调用时,此信息应该已经可用,并且您可以使用Java通过名称调用方法。另一种方法是在提交表单之前使用javascript在onclick事件处理程序中修改表单的action属性。

<s:form name="myForm" method="post" action="mySubmitAction" > 
    <s:submit value="Submit"/> 
    <s:submit value="Clear" onclick="myClearAction()"/> 
</form> 
<script> 
    function myClearAction(){ 
    document.forms["myForm"].action = "<s:url action='myClearAction' />"; 
    } 
</script> 
+0

谢谢为你的帮助,我将通过使用JavaScript来实现它 –