XssHttpServletRequestWrapper.java 3.9 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137
  1. package net.chenlin.dp.common.xss;
  2. import org.apache.commons.io.IOUtils;
  3. import org.apache.commons.lang.StringUtils;
  4. import org.springframework.http.HttpHeaders;
  5. import org.springframework.http.MediaType;
  6. import javax.servlet.ReadListener;
  7. import javax.servlet.ServletInputStream;
  8. import javax.servlet.http.HttpServletRequest;
  9. import javax.servlet.http.HttpServletRequestWrapper;
  10. import java.io.ByteArrayInputStream;
  11. import java.io.IOException;
  12. import java.util.LinkedHashMap;
  13. import java.util.Map;
  14. /**
  15. * XSS过滤处理
  16. * @author zcl<yczclcn@163.com>
  17. */
  18. public class XssHttpServletRequestWrapper extends HttpServletRequestWrapper {
  19. //没被包装过的HttpServletRequest(特殊场景,需要自己过滤)
  20. HttpServletRequest orgRequest;
  21. //html过滤
  22. private final static HTMLFilter htmlFilter = new HTMLFilter();
  23. public XssHttpServletRequestWrapper(HttpServletRequest request) {
  24. super(request);
  25. orgRequest = request;
  26. }
  27. @Override
  28. public ServletInputStream getInputStream() throws IOException {
  29. //非json类型,直接返回
  30. if(!super.getHeader(HttpHeaders.CONTENT_TYPE).equalsIgnoreCase(MediaType.APPLICATION_JSON_VALUE)){
  31. return super.getInputStream();
  32. }
  33. //为空,直接返回
  34. String json = IOUtils.toString(super.getInputStream(), "utf-8");
  35. if (StringUtils.isBlank(json)) {
  36. return super.getInputStream();
  37. }
  38. //xss过滤
  39. json = xssEncode(json);
  40. final ByteArrayInputStream bis = new ByteArrayInputStream(json.getBytes("utf-8"));
  41. return new ServletInputStream() {
  42. @Override
  43. public boolean isFinished() {
  44. return true;
  45. }
  46. @Override
  47. public boolean isReady() {
  48. return true;
  49. }
  50. @Override
  51. public void setReadListener(ReadListener readListener) {
  52. }
  53. @Override
  54. public int read() throws IOException {
  55. return bis.read();
  56. }
  57. };
  58. }
  59. @Override
  60. public String getParameter(String name) {
  61. String value = super.getParameter(xssEncode(name));
  62. if (StringUtils.isNotBlank(value)) {
  63. value = xssEncode(value);
  64. }
  65. return value;
  66. }
  67. @Override
  68. public String[] getParameterValues(String name) {
  69. String[] parameters = super.getParameterValues(name);
  70. if (parameters == null || parameters.length == 0) {
  71. return null;
  72. }
  73. for (int i = 0; i < parameters.length; i++) {
  74. parameters[i] = xssEncode(parameters[i]);
  75. }
  76. return parameters;
  77. }
  78. @Override
  79. public Map<String,String[]> getParameterMap() {
  80. Map<String,String[]> map = new LinkedHashMap<>();
  81. Map<String,String[]> parameters = super.getParameterMap();
  82. for (String key : parameters.keySet()) {
  83. String[] values = parameters.get(key);
  84. for (int i = 0; i < values.length; i++) {
  85. values[i] = xssEncode(values[i]);
  86. }
  87. map.put(key, values);
  88. }
  89. return map;
  90. }
  91. @Override
  92. public String getHeader(String name) {
  93. String value = super.getHeader(xssEncode(name));
  94. if (StringUtils.isNotBlank(value)) {
  95. value = xssEncode(value);
  96. }
  97. return value;
  98. }
  99. private String xssEncode(String input) {
  100. return htmlFilter.filter(input);
  101. }
  102. /**
  103. * 获取最原始的request
  104. */
  105. public HttpServletRequest getOrgRequest() {
  106. return orgRequest;
  107. }
  108. /**
  109. * 获取最原始的request
  110. */
  111. public static HttpServletRequest getOrgRequest(HttpServletRequest request) {
  112. if (request instanceof XssHttpServletRequestWrapper) {
  113. return ((XssHttpServletRequestWrapper) request).getOrgRequest();
  114. }
  115. return request;
  116. }
  117. }