아하
검색 이미지
생활꿀팁 이미지
생활꿀팁생활
생활꿀팁 이미지
생활꿀팁생활
멋쩍은코브라194
멋쩍은코브라19421.04.05

JSP 크로스 사이드 스트립트 질문입니다

유지보수를 하고 있는 초보 코더입니다.

고객사에서 서버쪽 크로스 사이드 스크립트 처리를 해달라는 요구사항이 왔습니다

문제가 되는 부분은 JSP에 연결된 JS파일쪽인데 그냥 JS파일만 처리해도 상관없는 부분인가요?

서버 사이드쪽에서 처리해달라고 보안부서에서 연락이 와서 JS 내의 소스를 JSP에 옮겨서 수정하면 되는건지 제가 제대로 JSP를 안 배워서 확신이 안 서네요...

55글자 더 채워주세요.
답변의 개수
8개의 답변이 있어요!
  • js 파일만 처리해주면 됩니다.

    통신할때 문제가 되는부분이 js 파일이라고 한다면

    우선 js 파일만 수정하시면 될거같아요.

    js 파일안에 있는 내용을 복사하셔서 jsp에 넣으시면 오히려 스크립트 내용 중복으로 문제가 될 소지가 있어요.

    우선 js파일 문제되는 부분 확인하시고 수정해보시면 될거같아요


  • 크로스 사이드 스크립트는 js에서도 처리해야 하지만

    혹은 jsp에 파라미터값 넘어올때도 처리를 해줘야 합니다.

    심지어 user-agent 쪽에 헤더정보에 <script>alert('tt')</script> 라는 해괴한 것 까지 처리를 해줘야

    방어가 됩니다.

    요지는 화면에서 script가 실행되지 않게끔 하는것 뿐만 아니라 파리미터에 넘어오는 것도 다 제거를 해줘야 하는것 입니다.


  • 웹사이트 XSS취약점 보완에는 라이브러리를 가져다 사용하는 것이 국룰이며, 라이브러리는 전문적인 보안 업체나 기업에서 만든 것을 사용하는 것이 좋습니다. 대표적으로 추천드리는 것은 OWASP Antisamy, NAVER Lucy XSS Filter, ESAPI 입니다. 해당 키워드를 제시해드리니 검색해보시고 자신의 웹 사이트에 적절한 것을 선택하여 적용하시면 됩니다.

    공통으로 쿼리 결과를 control하는 방법과 xss filter 클래스를 구현하는 방법이 있습니다.


  • 크로스 사이드 문제면 jsp 내에서는 해결이 쉽지않아요. 보안 강화로 인해서 스크립트내에서의 처리는 어렵구요.

    서버사이드에서의 해결은 보통 ajax 또는 해당 서버 호출후 리턴값을 받아서 처리 하는 경우가 많죠.

    또 js 로직을 java로 그대로 이관하는것은 간단한 유틸리성이 아니라면 어렵지요.

    우선은 어떻게 주고받을 것인지를 결정하고 해당 문제의 해결법을 찾으시는것을 추천합니다.

    가장 편한 방식은 ajax 로

    서버내에서 요청을 받아 목적지 서버로 값 전송 후 리턴 받은 값을 ajax 로 넘겨주어 처리하는 것이 일반적입니다.

    스프링등 푸레임 워크 사용 중이시라면 서버 설정을 통해서 크로스 사이드 처리가 가능 합니다.


  • JSP에서 JS를 import(호출) 하여 사용하는 형태입니다.

    그래서 수정할 로직이 들어있는 부분이 JS만이라면 대상인 JS만 수정하면 됩니다.

    그러면 알아서 JSP에서 JS를 읽어들여 수정사항이 반영이 됩니다.

    JSP쪽 수정은 신경 쓰실 일이 없기에 그대로 JS 수정 후 서버에 반영하면 됩니다.


  • 안녕하세요. 현업 5년째 개발자입니다.

    자세한 상황 및 서비스 환경에 따라 다르겟으나, 일반적으로 xss 취약점은 서버단에서 대응합니다.

    해당 서버 리소스의 escaping 처리하시면 많은 부분 해결되겟으나, 앞서 말씀드린 것처럼 공격에 맞는 대응방법을 찾으셔야할거 같습니다.

    구글에 왠만한 방법은 다 있으니 검색해보세요. 검색을 잘하는것도 개발 역량의 큰 부분입니다.


  • XSS(크로스 사이트 스크립트)는 공격자에 의해 작성된 스크립트가 다른 사용자에게 전달되는 것으로 어디서 처리하셔도 상관없습니다 Jsp에서 처리할 경우 아래와 같이 처리하시면 됩니다

    abc = abc.replaceAll("<","&lt;");

    abc = abc.replaceAll(">","&gt;");

    답변이 도움이 되셨길 바랍니다.


  • 탈퇴한 사용자
    탈퇴한 사용자21.04.06

    안녕하세요

    XSS (Cross site scripting)은 이용자가 악성 스크립트를 서버에 전송하여,

    응답 또는 다른 이용자의 화면에서 스크립트를 실행하는 것을 말합니다.

    XSS를 방지하는 방법은 (방법1) 웹브라우저에서 전송한 데이터의 스크립트 코드를 제거하거나, (방법2) 화면에 출력 시 스크립트 코드를 제거하여 보여 줄 수 있습니다.

    방법1과 방법2가 서로 장단점이 있지만 방법1은 공통으로 가능하고, 방법2는 화면마다 수정해야 하므로 방법1로 하는게 좋을 듯 싶습니다.

    데이터가 서버에 전송되면 파라미터의 값을 모두 체크하여 스크립트 코드를 제거해야 합니다.

    모두 체크하는 방법은 web.xml의 filter를 적용하는 방법, spring 사용 시 interceptor를 적용하는 방법 등이 있습니다.

    라이브러리를 쓰던지, 직접 구현을 하던지 프로세스는 거의 동일하며, DB 저장 전에 스크립트 태그를 제거한다고 보시면 됩니다.

    web.xml의 filter는 직접 만들어도 되지만 naver의 lucy 라이브러리를 많이 사용하기도 합니다.

    lucy로 적용이 어려운 경우에는 아래쪽에 직접 구현한 블로그를 보시고 하시는게 이해하시는데 더 도움이 될 수 있습니다.

    A. Lucy 이용

    Lucy Github : https://github.com/naver/lucy-xss-servlet-filter

    1. lucy 라이브러리를 추가합니다.

    - maven 사용 시

    <dependency> <groupId>com.navercorp.lucy</groupId> <artifactId>lucy-xss-servlet</artifactId> <version>2.0.0</version> </dependency>

    2. web.xml에 filter 추가

    ... <!-- xssEscapeServletFilter는 CharacterEncodingFilter 뒤에 위치해야 한다. --> <filter> <filter-name>encodingFilter</filter-name> <filter-class>org.springframework.web.filter.CharacterEncodingFilter</filter-class> <init-param> <param-name>encoding</param-name> <param-value>UTF-8</param-value> </init-param> </filter> <filter-mapping> <filter-name>encodingFilter</filter-name> <url-pattern>/*</url-pattern> </filter-mapping> <filter> <filter-name>xssEscapeServletFilter</filter-name> <filter-class>com.navercorp.lucy.security.xss.servletfilter.XssEscapeServletFilter</filter-class> </filter> <filter-mapping> <filter-name>xssEscapeServletFilter</filter-name> <url-pattern>/*</url-pattern> </filter-mapping> ...

    3. filter rule 등록

    - "lucy-xss-servlet-filter-rule.xml" 파일로 생성 후 classpath에 넣어주면 됩니다.

    <?xml version="1.0" encoding="UTF-8"?> <config xmlns="http://www.navercorp.com/lucy-xss-servlet"> <defenders> <!-- XssPreventer 등록 --> <defender> <name>xssPreventerDefender</name> <class>com.navercorp.lucy.security.xss.servletfilter.defender.XssPreventerDefender</class> </defender> <!-- XssSaxFilter 등록 --> <defender> <name>xssSaxFilterDefender</name> <class>com.navercorp.lucy.security.xss.servletfilter.defender.XssSaxFilterDefender</class> <init-param> <param-value>lucy-xss-sax.xml</param-value> <!-- lucy-xss-filter의 sax용 설정파일 --> <param-value>false</param-value> <!-- 필터링된 코멘트를 남길지 여부, 성능 효율상 false 추천 --> </init-param> </defender> <!-- XssFilter 등록 --> <defender> <name>xssFilterDefender</name> <class>com.navercorp.lucy.security.xss.servletfilter.defender.XssFilterDefender</class> <init-param> <param-value>lucy-xss.xml</param-value> <!-- lucy-xss-filter의 dom용 설정파일 --> <param-value>false</param-value> <!-- 필터링된 코멘트를 남길지 여부, 성능 효율상 false 추천 --> </init-param> </defender> </defenders> <!-- default defender 선언, 별다른 defender 선언이 없으면 default defender를 사용해 필터링 한다. --> <default> <defender>xssPreventerDefender</defender> </default> <!-- global 필터링 룰 선언 --> <global> <!-- 모든 url에서 들어오는 globalParameter 파라메터는 필터링 되지 않으며 또한 globalPrefixParameter로 시작하는 파라메터도 필터링 되지 않는다. --> <params> <param name="globalParameter" useDefender="false" /> <param name="globalPrefixParameter" usePrefix="true" useDefender="false" /> </params> </global> <!-- url 별 필터링 룰 선언 --> <url-rule-set> <!-- url disable이 true이면 지정한 url 내의 모든 파라메터는 필터링 되지 않는다. --> <url-rule> <url disable="true">/disableUrl1.do</url> </url-rule> <!-- url1 내의 url1Parameter는 필터링 되지 않으며 또한 url1PrefixParameter로 시작하는 파라메터도 필터링 되지 않는다. --> <url-rule> <url>/url1.do</url> <params> <param name="url1Parameter" useDefender="false" /> <param name="url1PrefixParameter" usePrefix="true" useDefender="false" /> </params> </url-rule> <!-- url2 내의 url2Parameter1만 필터링 되지 않으며 url2Parameter2는 xssSaxFilterDefender를 사용해 필터링 한다. --> <url-rule> <url>/url2.do</url> <params> <param name="url2Parameter1" useDefender="false" /> <param name="url2Parameter2"> <defender>xssSaxFilterDefender</defender> </param> </params> </url-rule> </url-rule-set> </config>

    ※ 참고로 parameter 만 filtering 하므로 json으로 통신하는 경우에는 직접 구현해야 합니다.

    B. 직접 구현

    직접 구현한 예제는 아래 블로그가 설명을 잘 해 놔서 링크 걸어 드립니다.

    참고 : https://epthffh.tistory.com/entry/XSS-%ED%95%84%ED%84%B0%ED%81%AC%EB%A1%9C%EC%8A%A4-%EC%82%AC%EC%9D%B4%ED%8A%B8-%EC%8A%A4%ED%81%AC%EB%A6%BD%ED%8A%B8Encoding-%ED%95%84%ED%84%B0