diff --git a/build.gradle b/build.gradle index 5d38b838..09654a25 100644 --- a/build.gradle +++ b/build.gradle @@ -107,6 +107,8 @@ dependencies { implementation 'org.apache.tika:tika-core:2.9.0' implementation 'org.apache.tika:tika-parsers:2.9.0' + // Jsoup + implementation 'org.jsoup:jsoup:1.17.1' } tasks.named('test') { diff --git a/src/main/java/clap/server/adapter/inbound/security/SecurityConfig.java b/src/main/java/clap/server/adapter/inbound/security/SecurityConfig.java index 4538d189..6d2a3d49 100644 --- a/src/main/java/clap/server/adapter/inbound/security/SecurityConfig.java +++ b/src/main/java/clap/server/adapter/inbound/security/SecurityConfig.java @@ -63,6 +63,19 @@ public SecurityFilterChain defaultFilterChain(HttpSecurity http) throws Exceptio private HttpSecurity defaultSecurity(HttpSecurity http) throws Exception { return http + .headers(headers -> headers + .contentSecurityPolicy(csp -> + csp.policyDirectives( + "default-src 'self'; " + + "script-src 'self' 'unsafe-inline' 'unsafe-eval'; " + + "style-src 'self' 'unsafe-inline'; " + + "img-src 'self' data: https:; " + + "font-src 'self' data: https:; " + + "object-src 'none'; " + + "base-uri 'self';" + ) + ) + ) .httpBasic(AbstractHttpConfigurer::disable) .csrf(AbstractHttpConfigurer::disable) .sessionManagement( diff --git a/src/main/java/clap/server/adapter/inbound/web/xss/XssTestController.java b/src/main/java/clap/server/adapter/inbound/web/xss/XssTestController.java new file mode 100644 index 00000000..f1269e71 --- /dev/null +++ b/src/main/java/clap/server/adapter/inbound/web/xss/XssTestController.java @@ -0,0 +1,54 @@ +package clap.server.adapter.inbound.web.xss; + +import clap.server.common.annotation.architecture.WebAdapter; +import clap.server.common.annotation.swagger.DevelopOnlyApi; +import io.swagger.v3.oas.annotations.Operation; +import io.swagger.v3.oas.annotations.tags.Tag; +import lombok.extern.slf4j.Slf4j; +import org.springframework.http.ResponseEntity; +import org.springframework.web.bind.annotation.*; + +@Slf4j +@WebAdapter +@RequestMapping("/api/xss-test") +@Tag(name = "xss 공격 테스트 API", description = "아래와 같은 페이로드들에 대해 테스트합니다.\n" + + "1. 기본적인 스크립트 삽입: ``\n" + + "2. 이미지 태그를 이용한 XSS: ``\n" + + "3. JavaScript 프로토콜: `javascript:alert('xss')`\n" + + "4. HTML 이벤트 핸들러:`
hover me
`\n" + + "5. SVG를 이용한 XSS: ``\n" + + "6. HTML5 태그를 이용한 XSS: `