質問: こんにちは、Stormといいます。 2月ほど前に2.3.16から2.3.24 にStrutsのバージョンを上げたのですがリクエストパラメータが消えてしまって困っています。 条件は「context.」という文字列のときにActionクラスでパラメータを受け取るフィルードの値が空文字になってしまいます。 「contexts」や「context」はきちんとActionクラスに渡ります。.(ドット)が無ければ問題ないようです。 デバックをしてみるとfilterクラスではServletRequestにまだ値がありました。 たぶん、StrutsがActionクラスのフィールドにリクエストパラメータをセットするタイミングで消えているのだと思われます。 回避方法をご存じの方がいたらよろしくお願いします。 因みに、Struts2.3.24に付属するサンプルアプリでもこの現象を確認することができます。 (URLはTomcat7の場合) 1.サンプルアプリのstruts2-showcase.warをデプロイ後に以下の画面にアクセス 2.「Name」欄に「contex.txt」と入力しsaveボタンを押下。 3.「Name is required」と必須入力エラーになる。
回答: リクエストパラメータにサーブレットの属性に関する名前が入っているものはフィルタリング(無視)の対象となります。 これはセキュリティ脆弱性の問題と関係あり、リクエストパラメータの名前にcontextが入ってしまうことで、コンテキスト属性(アプリケーション属性)を上書きできてしまう可能性があるため、2.3.16.3の頃からブロックする対処がなされてきました。 一部すり抜ける問題もありました =============== そのため、リクエストパラメータ名にrequest,session,contextなど、サーブレットの属性に関する名前は避けるべき実装となっております。 どうしても回避する場合は、struts.xmlのParametersInterceptorの設定にて、contextがあった場合は無視する設定を記載することになりますが、これはStruts2.3.24では推奨されておりません。 のSecurity Noteを参照してください。 公式ドキュメントにもIssue TrackerやRelease Noteにも明確に掲載されておりませんが「やってはいけない」実装例のようです。 別の名称に変えることが最善のようですね。 参考になれば幸いです。