Skip to content

Instantly share code, notes, and snippets.

@kawasima
Last active October 3, 2020 02:40
Show Gist options
  • Save kawasima/11275430 to your computer and use it in GitHub Desktop.
Save kawasima/11275430 to your computer and use it in GitHub Desktop.
Struts1 S2-020対応
/**
* 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;
}
}
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){
}
}
@jabaraster
Copy link

現時点で世に出回っているFilterでの対応はmultipart/form-dataのPOSTに対処できておらず不完全なので他の対処法を探していたところ、本Gistに出会いました。
貴重な情報をありがとうございます。

蛇足ながら、SafeResolver#nextメソッドの実装方法について、個人的には、親クラスのメソッドを呼び出す方法に安心感を覚えます。

@Override
public String next(final String pExpression) {
    final String ret = super.next(pExpression);
    if ("class".equalsIgnoreCase(ret)) {
        return "";
    }
    return ret;
}

@nakamura-to
Copy link

私も親クラスのメソッドを呼ぶ方がメソッドを再利用できて良いのではと思います。
また、 Resolver の設定に PropertyUtilsBean の protected なメソッドが使用されていますが、 public なメソッドで設定できると良いのではと思いました。

package と import 宣言をつけて整理してみました。
https://gist.github.com/nakamura-to/11347570

@motoy3d
Copy link

motoy3d commented Apr 28, 2014

使わせていただきました。ありがとうございます。
nakamura-toさんのコードがさらによいと思いました。
あと、web.xmlへの追記も必要ですね。

@ykare
Copy link

ykare commented Apr 28, 2014

少し違うのですが、BeanUtils#populate()の時点で弾くようにしてみました。

パターンはStruts2.13.16.2のcom.opensymphony.xwork2.ExcludedPatternsに合わせています。
MBSDさんのフィルタと同様、IllegalArgumentExceptionで落とすようにしています。
https://gist.github.com/ykare/1fb2d5d11e16cb0003c3

@kawasima
Copy link
Author

みなさま、ありがとうございます。
ご指摘のとおりですね(雑に作ってしまいました)。

@aeg
Copy link

aeg commented May 7, 2014

■修正していただいてありがとうございます。本コメントは対応済です(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