Struts 2.3.X 資安危機!

當初在2011年左右,Struts 2是非常夯的WEB MVC框架,網路上的資源也相當多
可能因為使用者眾多,近幾年來也成為駭客勤找漏洞的對象

在Struts 2.3版頻敏出現資安漏洞通報的情況下(大概半年一次)
官方也正式宣佈,2.3版進入EOL(End Of Life),不再提供後續支援更新
Apache Struts 2.3.x End-Of-Life (EOL) Announcement

官網的建議是請大家升級至2.5版,算是沒有放棄繼續維護
只是2.3版架構下,漏洞太多了,所以才決定直接放棄吧!

原則上2.3版升至2.5版本不會太困難
大致照官方的migration plan調整就行了

調整經驗分享

web.xml的filter設定調整
因為StrutsPrepareAndExecuteFilter的package有異動,所以要調整。 原本的內容如下
<filter>
    <filter-name>struts2</filter-name>
    <filter-class>org.apache.struts2.dispatcher.ng.filter.StrutsPrepareAndExecuteFilter</filter-class>
</filter>
filter-class的內容改成org.apache.struts2.dispatcher.filter.StrutsPrepareAndExecuteFilter
struts.xml的DTD內容調整(就是2.3的字眼換成2.5)
原本是
<!DOCTYPE struts PUBLIC
        "-//Apache Software Foundation//DTD Struts Configuration 2.3//EN"
        "http://struts.apache.org/dtds/struts-2.3.dtd">
改成
<!DOCTYPE struts PUBLIC
        "-//Apache Software Foundation//DTD Struts Configuration 2.5//EN"
        "http://struts.apache.org/dtds/struts-2.5.dtd">
jsp內使用struts tag,有部分標籤內容的id屬性要換成var的名字
包含以下tag,須搜尋專案中的jsp是否有使用到
<s:action>
<s:append>
<s:bean>
<s:date>
<s:generator>
<s:iterator>
<s:merge>
<s:number>
<s:set>
<s:sort>
<s:subset>
<s:text>
<s:url>
我的程式只有調整<s:iterator> (將id屬性改成var)
另外也有用<s:text>,只是做為i18n的轉換,沒有使用id屬性,所以不用調整
jsp內使用struts tag,escape屬性改成escapeHtml
先前有用一些內容含有特殊語法,希望顯示出來時直接用html tag方式放在內容 所以把escape功能設成false(預設為true)
<s:property escape="false" value='#alarmDetail.content'/>
上述要把escape屬性改成escapeHtml
<s:property escapeHtml="false" value='#alarmDetail.content'/>
action裡的屬性名稱,若首字(小寫)只有一個字母,則getter/setter命名規則調整
private String sTrng;
public String getSTrng() {...}
public void setSTrng(String str) {...}
最好改成下述命名方式
private String strng;
public String getStrng() {...}
public void setStrng(String str) {...}

migration plan裡還有提到Tiles的使用調整以及<s:div> tag的更動
要記得再到下列網址確認一下是否全都調整好了唷
https://cwiki.apache.org/confluence/display/WW/Struts+2.3+to+2.5+migration

留言

這個網誌中的熱門文章