Last active
October 3, 2020 02:40
-
-
Save kawasima/11275430 to your computer and use it in GitHub Desktop.
Struts1 S2-020対応
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
/** | |
* A Resolver that doesn't call getClass(). | |
* | |
* @author kawasima | |
*/ | |
public class SafeResolver extends DefaultResolver { | |
private static final char NESTED = '.'; | |
private static final char MAPPED_START = '('; | |
private static final char MAPPED_END = ')'; | |
private static final char INDEXED_START = '['; | |
private static final char INDEXED_END = ']'; | |
@Override | |
public String next(String expression) { | |
if (expression == null || expression.length() == 0) { | |
return null; | |
} | |
boolean indexed = false; | |
boolean mapped = false; | |
for (int i = 0; i < expression.length(); i++) { | |
char c = expression.charAt(i); | |
if (indexed) { | |
if (c == INDEXED_END) { | |
return expression.substring(0, i + 1); | |
} | |
} else if (mapped) { | |
if (c == MAPPED_END) { | |
return expression.substring(0, i + 1); | |
} | |
} else { | |
if (c == NESTED) { | |
String props = expression.substring(0, i); | |
if (props.equalsIgnoreCase("class")) { | |
return ""; | |
} else { | |
return props; | |
} | |
} else if (c == MAPPED_START) { | |
mapped = true; | |
} else if (c == INDEXED_START) { | |
indexed = true; | |
} | |
} | |
} | |
return expression; | |
} | |
} |
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
public class SafeResolverListener implements ServletContextListener{ | |
@Override | |
public void contextInitialized(ServletContextEvent event){ | |
SafeResolver resolver = new SafeResolver(); | |
PropertyUtilsBean.getInstance().setResolver(resolver); | |
} | |
@Override | |
public void contextDestoryed(ServletContextEvent event){ | |
} | |
} |
使わせていただきました。ありがとうございます。
nakamura-toさんのコードがさらによいと思いました。
あと、web.xmlへの追記も必要ですね。
少し違うのですが、BeanUtils#populate()の時点で弾くようにしてみました。
パターンはStruts2.13.16.2のcom.opensymphony.xwork2.ExcludedPatternsに合わせています。
MBSDさんのフィルタと同様、IllegalArgumentExceptionで落とすようにしています。
https://gist.github.com/ykare/1fb2d5d11e16cb0003c3
みなさま、ありがとうございます。
ご指摘のとおりですね(雑に作ってしまいました)。
■修正していただいてありがとうございます。本コメントは対応済です(2014/05/12)
貴重な情報ありがとうございます。
ところで、
SafeResolver.java:L31 のIF節において、オリジナルソースでは
return expression.substring(0, i);
にて、ループを抜け返却していますが、L33の条件を満さない場合にループを抜けないように書き変わっているために正しく動きません。
確認をお願いいたします。
qiita.com の記事でも、nakamura-to さんのGistを使ってねと書かれているので、影響は小さいと思いますが、念のためのコメントです。
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment
私も親クラスのメソッドを呼ぶ方がメソッドを再利用できて良いのではと思います。
また、 Resolver の設定に
PropertyUtilsBean
の protected なメソッドが使用されていますが、 public なメソッドで設定できると良いのではと思いました。package と import 宣言をつけて整理してみました。
https://gist.github.com/nakamura-to/11347570