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
모든 입력 개체(바인딩 및@RequestBody
json, 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의 코멘트 참조
우리는 @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
'programing' 카테고리의 다른 글
_GNU_SOUR와 __USE_GNU (0) | 2023.09.14 |
---|---|
JS에서 페이지를 언로딩(이동)하지 못하게 하려면 어떻게 해야 합니까? (0) | 2023.09.14 |
"도커 빌드" 중에 도커 이미지에서 /etc/hosts 파일을 업데이트하는 방법 (0) | 2023.09.14 |
"새로운 크로스 플랫폼 PowerShell https://aka.ms/pscore6 을 사용해 보십시오"를 억제합니다. (0) | 2023.09.14 |
Spring RestTemplate로 SSL 인증서 검사를 비활성화하는 방법? (0) | 2023.09.14 |