Skip to content

Instantly share code, notes, and snippets.

@kawasima
Last active October 3, 2020 02:40
Show Gist options
  • Star 4 You must be signed in to star a gist
  • Fork 1 You must be signed in to fork a gist
  • 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){
}
}
@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