由于某些原因,我需要创建一个带有两个提交按钮的表单,这些按钮将在提交后调用不同的操作。
我在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 :(得分: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时才有效。
这些限制对多个按钮的使用产生了副作用,其中action
或method
属性用于将s:submit
按钮绑定到除s:form
操作属性之外的操作。要使用多个按钮来执行自己的操作类方法,可以传递包含方法名称的参数。它可以是隐藏字段或提交字段等。
调用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>