programing

Spring MVC에서 사람들이 XSS를 하지 못하게 하려면 어떻게 해야 합니까?

skycolor 2023. 9. 14. 21:54
반응형

Spring MVC에서 사람들이 XSS를 하지 못하게 하려면 어떻게 해야 합니까?

Spring MVC에서 XSS를 방지하려면 어떻게 해야 합니까?지금은 사용자 텍스트를 출력하는 모든 곳을 JSTL에 넣고 있습니다.<c:out>태그 또는fn:escapeXml()기능은 하지만, 장소를 놓칠 수도 있기 때문에 오류가 발생하기 쉬운 것 같습니다.

이것을 방지할 수 있는 쉬운 체계적인 방법이 있습니까?필터 같은 거?다음을 지정하여 입력을 수집하고 있습니다.@RequestParam내 컨트롤러 메소드에 대한 파라미터.

봄에 당신은 다음과 같이 생성된 JSP 페이지로부터 html을 탈출할 수 있습니다.<form>tags. 이렇게 하면 XSS 공격에 대한 많은 경로가 차단되며, 세 가지 방법으로 자동으로 수행할 수 있습니다.

의 전체 응용프로그램에 대해web.xml파일:

<context-param>
    <param-name>defaultHtmlEscape</param-name>
    <param-value>true</param-value>
</context-param>

파일 자체의 특정 페이지에 있는 모든 양식에 대해:

<spring:htmlEscape defaultHtmlEscape="true" /> 

양식별로:

<form:input path="someFormField" htmlEscape="true" /> 

다음을 통해 최대 절전 모드 검증기를 사용합니다.@Valid모든 입력 개체(바인딩 및@RequestBodyjson, https://dzone.com/articles/spring-31-valid-requestbody) 참조.@org.hibernate.validator.constraints.SafeHtml저에게 좋은 해결책입니다.

동면SafeHtmlValidator에 달려 있습니다org.jsoup, 따라서 프로젝트 종속성을 하나 더 추가해야 합니다.

<dependency>
    <groupId>org.jsoup</groupId>
    <artifactId>jsoup</artifactId>
    <version>1.10.1</version>
</dependency>

콩으로User야전으로

@NotEmpty
@SafeHtml
protected String name;

값 있는 업데이트 시도를 위해<script>alert(123)</script>통제하에

@PutMapping(value = "/{id}", consumes = MediaType.APPLICATION_JSON_VALUE)
public void update(@Valid @RequestBody User user, @PathVariable("id") int id) 

아니면

@PostMapping
public void createOrUpdate(@Valid User user) {

던지다BindException제본용 및MethodArgumentNotValidException위해서@RequestBody기본 메시지와 함께:

name may have unsafe html content

validator는 지속되기 전과 마찬가지로 바인딩에서도 작동합니다.http://topjava.herokuapp.com/ 에서 앱을 테스트할 수 있습니다.

업데이트: @GuyT의 코멘트 참조

CVE-2019-10219 및 @SafeHtml 현황

우리는 @SafeHtml 제약과 관련된 CVE-2019-10219를 알게 되었고, 그것은 6.0.18에서 모두 수정되었습니다.결승전과 6.1.0.마지막..

그러나 @SafeHtml 제약 조건은 취약하고 보안에 민감하며 이러한 목적으로 설계되지 않은 외부 라이브러리에 의존한다는 결론에 도달했습니다.핵심 Hibernate Validator에 포함시키는 것은 그다지 좋은 생각은 아니었습니다.그래서 감가상각을 하고 제거 표시를 한 겁니다.여기에는 마법 계획이 없으므로 사용자가 직접 이 제약 조건을 유지해야 합니다.

나 자신을 위한 이력서: 더 나은 해결책을 찾을 때까지 안전하고 사용할 수 있습니다.

업데이트: 제거로 인해@SafeHtml/SafeHtmlValidator부터hibernate.validator자기 것으로 삼다NoHtmlValidator, https://stackoverflow.com/a/68888601/548473 를 참조하십시오.

XSSFilter를 시도합니다.

XSS를 막으려고 할 때는 상황을 생각하는 것이 중요합니다.예를 들어 HTML 태그 또는 HTML 속성으로 데이터를 출력하는 것과 달리 자바스크립트 스니펫에서 변수 내부에 데이터를 출력하는 경우에는 탈출 방법과 방법이 매우 다릅니다.

여기에 에 대한 예가 있습니다: http://erlend.oftedal.no/blog/ ?twoid=91

OWASP XSS Prevention Cheat Sheet도 확인하세요: http://www.owasp.org/index.php/XSS_%28Cross_Site_Scripting%29_Prevention_Cheat_Sheet

따라서 Tendayi Mawushe가 제안한 것처럼 출력을 탈출해야 하지만 HTML 속성이나 javascript로 데이터를 출력할 때는 특별히 주의해야 합니다.

애초에 사용자 입력을 어떻게 수집하고 있습니까?이 질문/답변을 사용하는 경우 도움이 될 수 있습니다.FormController:

스프링: 명령에 바인딩할 때 입력 이탈

사용하는 방법과 태그를 항상 수동으로 확인하고 마지막에는 항상(한 번) 탈출하는지 확인합니다.프레임워크는 이 측면에서 많은 버그와 차이점을 가지고 있습니다.

개요: http://www.gablog.eu/online/node/91

하는에만 하는 대신 <c:out />, 또한 안티픽스 라이브러리를 사용해야 하는데, 이 라이브러리는 입력된 악성 스크립트를 인코딩할 뿐만 아니라 검사합니다.OWASP 안티사미는 최고의 라이브러리 중 하나이며, 유연성이 뛰어나고 요구 사항에 따라 xml 정책 파일을 사용하여 구성할 수 있습니다.

예를 들어, 응용프로그램이 텍스트 입력만 지원하는 경우 OWASP에서 제공하는 대부분의 일반 정책 파일을 사용할 수 있으며, 이 파일은 대부분의 HTML 태그를 검사하고 제거합니다.마찬가지로 애플리케이션이 모든 종류의 HTML 태그를 필요로 하는 HTML 편집기(tinymce 등)를 지원한다면 ebay 정책 파일과 같이 보다 유연한 정책을 사용할 수 있습니다.

**To avoid XSS security threat in spring application**

XSS 문제에 대한 해결책은 양식 제출 시 양식의 모든 텍스트 필드를 필터링하는 것입니다.

    It needs XML entry in the web.xml file & two simple classes.

        java code :-
        The code for the  first class named CrossScriptingFilter.java is :

        package com.filter;

        import java.io.IOException;
        import javax.servlet.Filter;
        import javax.servlet.FilterChain;
        import javax.servlet.FilterConfig;
        import javax.servlet.ServletException;
        import javax.servlet.ServletRequest;
        import javax.servlet.ServletResponse;
        import javax.servlet.http.HttpServletRequest;
        import org.apache.log4j.Logger;

        public class CrossScriptingFilter implements Filter {
            private static Logger logger = Logger.getLogger(CrossScriptingFilter.class);
            private FilterConfig filterConfig;

            public void init(FilterConfig filterConfig) throws ServletException {
                this.filterConfig = filterConfig;
            }

            public void destroy() {
                this.filterConfig = null;
            }

            public void doFilter(ServletRequest request, ServletResponse response, FilterChain chain)
                throws IOException, ServletException {
                logger.info("Inlter CrossScriptingFilter  ...............");
                chain.doFilter(new RequestWrapper((HttpServletRequest) request), response);
                logger.info("Outlter CrossScriptingFilter ...............");
            }

        }

RequestWrapper.java라는 코드의 두 번째 클래스는 다음과 같습니다.

패키지 com.필터;

import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletRequestWrapper;

import org.apache.log4j.Logger;

public final class RequestWrapper extends HttpServletRequestWrapper {
    private static Logger logger = Logger.getLogger(RequestWrapper.class);
    public RequestWrapper(HttpServletRequest servletRequest) {
        super(servletRequest);
    }

    public String[] getParameterValues(String parameter) {
        logger.info("InarameterValues .. 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] = cleanXSS(values[i]);
        }
        return encodedValues;
    }

    public String getParameter(String parameter) {
        logger.info("Inarameter .. parameter .......");
        String value = super.getParameter(parameter);
        if (value == null) {
            return null;
        }
        logger.info("Inarameter RequestWrapper ........ value .......");
        return cleanXSS(value);
    }

    public String getHeader(String name) {
        logger.info("Ineader .. parameter .......");
        String value = super.getHeader(name);
        if (value == null)
            return null;
        logger.info("Ineader RequestWrapper ........... value ....");
        return cleanXSS(value);
    }

    private String cleanXSS(String value) {
        // You'll need to remove the spaces from the html entities below
        logger.info("InnXSS RequestWrapper ..............." + value);
        //value = value.replaceAll("<", "& lt;").replaceAll(">", "& gt;");
        //value = value.replaceAll("\\(", "& #40;").replaceAll("\\)", "& #41;");
        //value = value.replaceAll("'", "& #39;");
        value = value.replaceAll("eval\\((.*)\\)", "");
        value = value.replaceAll("[\\\"\\\'][\\s]*javascript:(.*)[\\\"\\\']", "\"\"");

        value = value.replaceAll("(?i)<script.*?>.*?<script.*?>", "");
        value = value.replaceAll("(?i)<script.*?>.*?</script.*?>", "");
        value = value.replaceAll("(?i)<.*?javascript:.*?>.*?</.*?>", "");
        value = value.replaceAll("(?i)<.*?\\s+on.*?>.*?</.*?>", "");
        //value = value.replaceAll("<script>", "");
        //value = value.replaceAll("</script>", "");
        logger.info("OutnXSS RequestWrapper ........ value ......." + value);
        return value;
    }

남은 것은 web.xml 파일의 XML 항목뿐입니다.

        <filter>
        <filter-name>XSS</filter-name>
        <display-name>XSS</display-name>
        <description></description>
        <filter-class>com.filter.CrossScriptingFilter</filter-class>
    </filter>

    <filter-mapping>
        <filter-name>XSS</filter-name>
        <url-pattern>/*</url-pattern>
    </filter-mapping>

/*는 브라우저에서 요청할 때마다 CrossScriptingFilter 클래스를 호출함을 나타냅니다.이것은 요청에서 온 모든 구성 요소/요소를 파싱하고 해커가 입력한 모든 자바스크립트 태그를 빈 문자열로 대체할 것입니다.

언급URL : https://stackoverflow.com/questions/2147958/how-do-i-prevent-people-from-doing-xss-in-spring-mvc

반응형