java中SpringMVC中@PathVariable註解的XSS注入問題

來源:互聯網
上載者:User

 XSS注入算是一個很常見的問題,其實解決起來並不難,但是有很多需要注意的地方,這裡做一個完整的解決方案。

   Java中常見的解決方案是繼承HttpServletRequestWrapper,然後重載getParameter、getHeader等方法。但是要注意到檔案上傳是不走HttpServletRequestWrapper的,所有還需要解決檔案上傳時的xss問題。如果用SpringMVC,那麼直接繼承CommonsMultipartResolver即可。


如果使用了url中部分path(即@PathVariable註解)值,同樣有xss問題。常見代碼如下:

 代碼如下 複製代碼

@Controller
@RequestMapping("/some")
public class SomeController{
 
  @RequestMapping(value = "/{somepath}")
  public String func(@PathVariable("somepath")String somepath){
    doSomething(path);
    return "";
   }

}

其中url的path並不走HttpServletRequest,同樣也存在XSS問題。

    用SpingMVC時覺得應該有一個解析UrlPath的類來完成這個工作(就像HandlerMapping、ViewResovler一樣),讓使用者自訂,但實際上並沒有。分析源碼url匹配解析是在AbstractHandlerMapping這個類中。

 代碼如下 複製代碼

/* org.springframework.web.servlet.handler.AbstractHandlerMapping 類 */
public abstract class AbstractHandlerMapping extends WebApplicationObjectSupport implements HandlerMapping, Ordered {
   private int order = Integer.MAX_VALUE;  // default: same as non-Ordered
   private Object defaultHandler;
   private UrlPathHelper urlPathHelper = new UrlPathHelper();
   private PathMatcher pathMatcher = new AntPathMatcher();

/* 省略代碼... */

  其中UrlPathHelper 類中包含decodePathVariables和decodeMatrixVariables兩個方法即為抽取path參數,所以自訂一個UrlPathHelper來完成參數過濾功能。然後所有AbstractHandlerMapping均使用自訂UrlPathHelper即可。但是需要注意的是SpringMVC預設產生了兩個HandlerMapping->RequestMappingHandlerMapping和BeanNameUrlHandlerMapping,其是在WebMvcConfigurationSupport這個類中產生的,所有必須設定這兩個HandlerMapping的urlPathHelper,沒有直接的調用介面,那麼監聽Spring的bean執行個體化即可,建立類如下:

/* 解決@PathVariable註解造成的xss攻擊問題,注意:此類必需由WebApplicationContext初始化 */
public class XssHandlerMappingPostProcessor implements BeanPostProcessor{

  @Override
  public Object postProcessBeforeInitialization(Object bean, String beanName) throws BeansException{
    return bean;
  }

  @Override
  public Object postProcessAfterInitialization(Object bean, String beanName) throws BeansException{
    if(bean instanceof AbstractHandlerMapping){
      AbstractHandlerMapping ahm = (AbstractHandlerMapping) bean;
      ahm.setUrlPathHelper(new XssUrlPathHelper());
    }

    return bean;
  }

  static class XssUrlPathHelper extends UrlPathHelper{

    @Override
    public Map<String, String> decodePathVariables(HttpServletRequest request, Map<String, String> vars){
      Map<String, String> result = super.decodePathVariables(request, vars);
      if(!CollectionUtils.isEmpty(result)){
        for(String key : result.keySet()){
          result.put(key, cleanXSS(result.get(key)));
        }
      }

      return result;
    }

    @Override
    public MultiValueMap<String, String> decodeMatrixVariables(HttpServletRequest request,
        MultiValueMap<String, String> vars){
      MultiValueMap<String, String> mvm = super.decodeMatrixVariables(request, vars);
      if(!CollectionUtils.isEmpty(mvm)){
        for(String key : mvm.keySet()){
          List<String> value = mvm.get(key);
          for(int i = 0; i < value.size(); i++){
            value.set(i, cleanXSS(value.get(i)));
          }
        }
      }

      return mvm;
    }

    private String cleanXSS(String value){
      return HtmlUtils.htmlEscape(value);
    }

  }

}

監聽bean的執行個體化,然後即可設定所有HandlerMapping的UrlPathHelper。當然如果使用的Spring的4.x版本,已經提供了自訂UrlPathHelper配置了:

 代碼如下 複製代碼

<mvc:annotation-driven enable-matrix-variables="false" >
  <mvc:path-matching path-helper="" path-matcher="" />
</mvc:annotation-driven>

這樣基本已在輸入源頭解決的XSS問題。如果網站還存在js跨域等其它問題,也可引入Content-Security-Policy。

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.