問題:

原本在同一個form裡兩不同按鈕submit到兩個不同action這個功能可以透過 DynamicMethodInvocation (DMI)來達成
(設定 <s:submit name="action:XX"> 或 <s:submit action="XX">)

因為Struts的安全性漏洞,會造成駭客可以利用DMI上傳惡意程式碼
後續官方就改成預設關閉這個功能
(為了讓用了這功能的舊專案可以繼續執行,可以手動打開,但就是有比較大的資安風險,畢竟是已公開的漏洞)

這影響了同一個form裡兩個不同按鈕要sumit到不同地方的機能,把DMI設為關閉就無法使用原本方法達成
他建議改成這幾種替代方法

但他提供的兩個方法都要進action才判定
不能針對不同的submit按鈕分開做XML validation

下面有附註一個非官方的其他人的方法,但是必須開啟下列屬性纔有用
<constant name="struts.mapper.action.prefix.enabled" value="true"/>
而這個屬性在較新的版本裡被官方以安全問題為由預設關閉

解法 :

改用JAVASCRIPT來改變FORM的SUBMIT目標

每個頁面都會引入的通用函式庫 common.js 裡加入這個function,引入到tiles的layout檔裡面
function setFormAction(formId, action){
    $("#"+formId).attr("action", action);
}

然後在每個需要multi submit的jsp裡這樣設定
<s:form id="aaaForm">
<s:submit
onclick="setFormAction('aaaForm', 'aaa_save');">
<s:submit
onclick="setFormAction('aaaForm', 'aaa_delete');">
</s:form>

每個表單這樣搞,老實說真是超~麻煩的
但為了安全也沒辦法.......

相關文章