Struts2 2.3.15.1版本对参数处理存在问题
??? 前一段时间struts2爆出严重漏洞,因此需要将项目中struts2由2.3.1升级到2.3.15.1官方最新版本。在升级完成之后,发现原先运行正常的功能出问题了,页面向后台传递的部分参数丢失。通过跟踪struts2发现,负责处理页面参数ParametersInterceptor中默认参数过滤规则与2.3.1版本存在很大差异。
2.3.15.1版本: \w+((\.\w+)|(\[\d+\])|(\(\d+\))|(\['\w+'\])|(\('\w+'\)))*
2.3.1版本: [a-zA-Z0-9\\.\\]\\[\\(\\)_'\\s]+
因此像 map[user.id].value=1 这种格式的参数就会被过滤掉。为了解决这个问题,在params拦截器中,增加acceptParamNames参数,代码如下:
<interceptor-ref name="params">
??? <param name="excludeParams">dojo\..*,^struts\..*</param>
??? <param name="acceptParamNames">\w+((\.\w+)|(\[\d+\])|(\(\d+\))|(\['[a-z0-9A-Z_.]+'\])|(\('\w+'\)))*</param>
</interceptor-ref>
将原先倒数第二个\w+改为[a-z0-9A-Z_.]+,允许出现“.”符号,问题就解决了。