2017-01-30 5 views
1

Привет в моем проекте Veracode сообщил вопрос XSS КВО ID 80. Здесь, в моей просьбе метода обработчика:Предотвратить XSS в Spring MVC контроллер

@RequestMapping(value = "/Update.mvc") 
public @ResponseBody String execute(@ModelAttribute UpdateForm updateForm, BindingResult result, 
     HttpServletRequest request, HttpServletResponse response) throws ActionException { 
    return executeAjax(updateForm, request, response, result); 
} 

Так executeAjax происходит от абстрактного класса и имеет различные варианты реализации? В этих реализациях пользовательский ввод из формы обрабатывается и обрабатывается, чтобы построить возвращаемую строку.

Так что мой вопрос: Является ли предположение Veracode о том, что в реализации может быть XSS? Или что-то общее? - Как это предотвратить? Я всегда использую преобразование входных данных, и он не возвращается, когда пользователь вводит его? - Итак, как предотвратить это? - Должен ли я избегать всех заголовков/параметров запроса из HttpServiceRequest?

Edit: Должен ли я использовать фильтры, как: SecurityWrapperRequest

+0

Вам нужно избежать всех параметров запроса. Например. добавив фильтр – StanislavL

+0

@StanislavL вы ​​можете дать более подробное объяснение. Мне нужно добавить фильтр HttpRequest, чтобы избежать всех заголовков и всех параметров из запроса? Или я могу работать на локальном уровне и обернуть запрос только для всех реализаций классов executeAjax? LikeL https://www.javacodegeeks.com/2012/07/anti-cross-site-scripting-xss-filter.html – Xelian

ответ

2

Вы можете использовать XSSFilter, чтобы избежать всех параметров запроса. См here

public class XSSFilter implements Filter { 

    @Override 
    public void init(FilterConfig filterConfig) throws ServletException { 
    } 

    @Override 
    public void destroy() { 
    } 

    @Override 
    public void doFilter(ServletRequest request, ServletResponse response, FilterChain chain) 
     throws IOException, ServletException { 
     chain.doFilter(new XSSRequestWrapper((HttpServletRequest) request), response); 
    } 

} 

и обертка

import java.util.regex.Pattern; 
import javax.servlet.http.HttpServletRequest; 
import javax.servlet.http.HttpServletRequestWrapper; 

public class XSSRequestWrapper extends HttpServletRequestWrapper { 

    public XSSRequestWrapper(HttpServletRequest servletRequest) { 
     super(servletRequest); 
    } 

    @Override 
    public String[] getParameterValues(String parameter) { 
     String[] values = super.getParameterValues(parameter); 

     if (values == null) { 
      return null; 
     } 

     int count = values.length; 
     String[] encodedValues = new String[count]; 
     for (int i = 0; i < count; i++) { 
      encodedValues[i] = stripXSS(values[i]); 
     } 

     return encodedValues; 
    } 

    @Override 
    public String getParameter(String parameter) { 
     String value = super.getParameter(parameter); 

     return stripXSS(value); 
    } 

    @Override 
    public String getHeader(String name) { 
     String value = super.getHeader(name); 
     return stripXSS(value); 
    } 

    private String stripXSS(String value) { 
     if (value != null) { 
      // NOTE: It's highly recommended to use the ESAPI library and uncomment the following line to 
      // avoid encoded attacks. 
      // value = ESAPI.encoder().canonicalize(value); 

      // Avoid null characters 
      value = value.replaceAll("", ""); 

      // Avoid anything between script tags 
      Pattern scriptPattern = Pattern.compile("<script>(.*?)</script>", Pattern.CASE_INSENSITIVE); 
      value = scriptPattern.matcher(value).replaceAll(""); 

      // Avoid anything in a src='...' type of expression 
      scriptPattern = Pattern.compile("src[\r\n]*=[\r\n]*\\\'(.*?)\\\'", Pattern.CASE_INSENSITIVE | Pattern.MULTILINE | Pattern.DOTALL); 
      value = scriptPattern.matcher(value).replaceAll(""); 

      scriptPattern = Pattern.compile("src[\r\n]*=[\r\n]*\\\"(.*?)\\\"", Pattern.CASE_INSENSITIVE | Pattern.MULTILINE | Pattern.DOTALL); 
      value = scriptPattern.matcher(value).replaceAll(""); 

      // Remove any lonesome </script> tag 
      scriptPattern = Pattern.compile("</script>", Pattern.CASE_INSENSITIVE); 
      value = scriptPattern.matcher(value).replaceAll(""); 

      // Remove any lonesome <script ...> tag 
      scriptPattern = Pattern.compile("<script(.*?)>", Pattern.CASE_INSENSITIVE | Pattern.MULTILINE | Pattern.DOTALL); 
      value = scriptPattern.matcher(value).replaceAll(""); 

      // Avoid eval(...) expressions 
      scriptPattern = Pattern.compile("eval\\((.*?)\\)", Pattern.CASE_INSENSITIVE | Pattern.MULTILINE | Pattern.DOTALL); 
      value = scriptPattern.matcher(value).replaceAll(""); 

      // Avoid expression(...) expressions 
      scriptPattern = Pattern.compile("expression\\((.*?)\\)", Pattern.CASE_INSENSITIVE | Pattern.MULTILINE | Pattern.DOTALL); 
      value = scriptPattern.matcher(value).replaceAll(""); 

      // Avoid javascript:... expressions 
      scriptPattern = Pattern.compile("javascript:", Pattern.CASE_INSENSITIVE); 
      value = scriptPattern.matcher(value).replaceAll(""); 

      // Avoid vbscript:... expressions 
      scriptPattern = Pattern.compile("vbscript:", Pattern.CASE_INSENSITIVE); 
      value = scriptPattern.matcher(value).replaceAll(""); 

      // Avoid onload= expressions 
      scriptPattern = Pattern.compile("onload(.*?)=", Pattern.CASE_INSENSITIVE | Pattern.MULTILINE | Pattern.DOTALL); 
      value = scriptPattern.matcher(value).replaceAll(""); 
     } 
     return value; 
    } 
} 

На самом деле вы можете использовать фильтр в качестве фундамента и расширить его, чтобы добавить любую требуемую логику обертке.

+0

Будет иметь негативное влияние на производительность, потому что эти соответствия Patters не очень легкие? – Xelian

+1

В любом случае функции безопасности негативно влияют на производительность. Попробуйте заменить проверки шаблонов более быстрыми. – StanislavL

+0

Что касается обертки ESAPI? Могу ли я использовать его? https://github.com/ESAPI/esapi-java-legacy/blob/2ff45b140a7e7b527a93bcdbc6bd7a1b3c188aca/src/main/java/org/owasp/esapi/filters/SecurityWrapperRequest.java – Xelian

 Смежные вопросы

  • Нет связанных вопросов^_^