反省

OGNLのなんでもできる便利さは実装の甘さにより脅威に対して無防備となる可能性がありましたね。

https://www.sec-consult.com/files/20120104-0_Apache_Struts2_Multiple_Critical_Vulnerabilities.txt

2.3.1 など相当枯れたと思われたバージョンでも外部からなんでもできてしまうセキュリティホールが多数(笑)発見されるなど恐ろしすぎてとても業務で使えるものではないかもしれません。

default-interceptor-refのバグ

Struts2の設定で default-interceptor-ref を指定するといちいち個別の Action に interceptor-ref を書かないで済むので package で default-interceptor-ref を指定して package 内の Action ではすべて共通のinterceptorスタックを適用するような指定方法をとっていた。

が、バグがありこの方法は注意が必要だった。

続きを読む

日本語Struts2本が発売になります

毎日コミュニケーションズ社から本サイト関連のStruts2と各コンポーネントの日本語の本が出版されることになりました。

サンプルアプリケーションの作成を通してStruts2+Spring2+Tiles+iBATIS+GWTフルスタック構成でのWebサイト作成がとても簡単に行るようになります。

struts 2.0.12

Struts2が2.0.12にバージョンアップしていた。

アップグレードはjarを差し替えるだけなので問題は無いけどちょっとはまったので。。。
WTP環境で、WEB-INF/lib 下の古いバージョンのjarを削除して、新しいjarに入れ替えサーバーを起動しようとしたところ

Unable to load bean: type: class:com.opensymphony.xwork2.ObjectFactory - bean - jar:file:/C:/workspace/.metadata/.plugins/org.eclipse.wst.server.core/tmp0/wtpwebapps/struts2test/WEB-INF/lib/struts2-core-2.0.12.jar!/struts-default.xml:30:72
	at com.opensymphony.xwork2.config.providers.XmlConfigurationProvider.register(XmlConfigurationProvider.java:208)
	at org.apache.struts2.config.StrutsXmlConfigurationProvider.register(StrutsXmlConfigurationProvider.java:101)
	at com.opensymphony.xwork2.config.impl.DefaultConfiguration.reload(DefaultConfiguration.java:131)
	at com.opensymphony.xwork2.config.ConfigurationManager.getConfiguration(ConfigurationManager.java:52)
	at org.apache.struts2.dispatcher.Dispatcher.init_PreloadConfiguration(Dispatcher.java:395)
	at org.apache.struts2.dispatcher.Dispatcher.init(Dispatcher.java:452)
	at org.apache.struts2.dispatcher.FilterDispatcher.init(FilterDispatcher.java:201)
	at org.apache.catalina.core.ApplicationFilterConfig.getFilter(ApplicationFilterConfig.java:275)
	at org.apache.catalina.core.ApplicationFilterConfig.setFilterDef(ApplicationFilterConfig.java:397)
	at org.apache.catalina.core.ApplicationFilterConfig.<init>(ApplicationFilterConfig.java:108)
	at org.apache.catalina.core.StandardContext.filterStart(StandardContext.java:3696)
	at org.apache.catalina.core.StandardContext.start(StandardContext.java:4343)
	at org.apache.catalina.core.ContainerBase.start(ContainerBase.java:1045)
	at org.apache.catalina.core.StandardHost.start(StandardHost.java:719)
	at org.apache.catalina.core.ContainerBase.start(ContainerBase.java:1045)
	at org.apache.catalina.core.StandardEngine.start(StandardEngine.java:443)
	at org.apache.catalina.core.StandardService.start(StandardService.java:516)
	at org.apache.catalina.core.StandardServer.start(StandardServer.java:710)
	at org.apache.catalina.startup.Catalina.start(Catalina.java:566)
	at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
	at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:39)
	at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:25)
	at java.lang.reflect.Method.invoke(Method.java:597)
	at org.apache.catalina.startup.Bootstrap.start(Bootstrap.java:288)
	at org.apache.catalina.startup.Bootstrap.main(Bootstrap.java:413)
Caused by: Bean type class com.opensymphony.xwork2.ObjectFactory with the name xwork has already been loaded by bean - jar:file:/C:/workspace/.metadata/.plugins/org.eclipse.wst.server.core/tmp0/wtpwebapps/struts2test/WEB-INF/lib/struts2-core-2.0.11.jar!/struts-default.xml:30:72 - bean - jar:file:/C:/workspace/.metadata/.plugins/org.eclipse.wst.server.core/tmp0/wtpwebapps/struts2test/WEB-INF/lib/struts2-core-2.0.12.jar!/struts-default.xml:30:72
	at com.opensymphony.xwork2.config.providers.XmlConfigurationProvider.register(XmlConfigurationProvider.java:193)
	... 24 more

というエラーで起動できず。
http://issues.apache.org/struts/browse/WW-2478
こんな感じです。

で、結局 WTPのデプロイされた側に古いjarが消されず残っていたのが原因だった。
古いjarを削除したところ問題ないなく起動するようになった。
どうもWTPだと WEB-INF/lib 下に関しては追加は同期してくれるが、削除はされないようだ。

このエラーが出たらWTPのデプロイ先の

<ワークスペース>\.metadata\.plugins\org.eclipse.wst.server.core\tmp0\wtpwebapps

の下あたりに配置してあるアプリを確認する必要がある。

Interceptorパラメータ設定

Struts2でInterceptorのパラメータを設定する場合、

<interceptor-ref name="hoge">
  <param name="fileUpload.maxallowsize">10000</param>
</intrerceptor-ref>

などと記述することができて便利であるが、hogeインターセプター・スタックに fileUpload インターセプターが無くてもエラーにならないので注意が必要だ。

存在しないインターセプター名であれば警告が出るし、存在しないプロパティでも警告が出る。しかし存在するインターセプター名だとインターセプター・スタックに列挙されていなくても警告してくれないのだ。
実際には設定は無視されて機能しないので警告ぐらいしてくれてもよさそうだ。

ちょっとTIPS:devModeをtureにしても警告してくれない。

OGNLでNestしたMapへのアクセス

Struts2のOGNLでのNestしたMapへのアクセスで少し躓いた。

<s:set name="nestmap" value="#{
  'a' : #{ 'A' : 'aa', 'B' : 'bb' },
  'b' : #{ 'A' : 'cc', 'B' : 'dd' }
}"/>

このようなNestしたMapがあったとして、これにアクセスする場合次のどれでもアクセスできる

<s:property value="#nestmap.a.A"/>
<s:property value="#nestmap['a'].A"/>
<s:property value="#nestmap['a']['A']"/>

これは問題ない。しかし、次のように一階層を代入してアクセスしようとすると意図通りに動作しない

<s:set name="secondmap" value="#nestmap.a"/>
<s:property value="#secondmap.A"/>

なぜだろう。