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: `