필터()를 사용하세요: 결정론적 파이프라인, 오탐률 감소, '필터를 소독제로' 오해 없애기
검색한 경우 "자바스크립트 필터"를 선택하면 이러한 결과 중 하나를 원할 확률이 높습니다:
- 노이즈가 많은 스캔 출력을 깔끔하게 바꿔보세요, 실행 가능 후보 목록.
- 스파게티 루프를 작성하지 않고도 개체 배열(자산, 결과물, IOC, 규칙)을 필터링할 수 있습니다.
- CI, 브라우저 샌드박스 또는 보안 파이프라인 내부에서 실행할 수 있을 만큼 빠르게 필터링하세요.
- '문자열 필터링' ≠ '신뢰할 수 없는 입력을 안전하게 만들기'라는 고전적인 함정을 피하세요.
마지막은 많은 보안 도구가 조용히 실패하는 부분입니다.
롱테일 쿼리를 사용하는 데에는 이유가 있습니다. "자바스크립트 객체 필터 배열" 는 상록수입니다. 정식 스택 오버플로 스레드의 제목은 정확히 다음과 같습니다. "228,000회 조회"는 실무자가 실제로 클릭, 복사 및 배포하는 내용을 보여주는 강력한 신호입니다. (스택 오버플로)
무엇 Array.prototype.filter() 보장하는 것(그리고 절대 보장하지 않는 것)
언어 수준에서, filter():
- 를 반환합니다. 새 배열 술어가 참을 반환하는 요소를 포함합니다.
- 를 생성합니다. 얕은 복사 (객체 참조는 복제되지 않고 공유됨). (MDN 웹 문서)
- 건너뛰기 빈 슬롯 를 스파스 배열에 넣습니다(술어는 "구멍"에 대해 호출되지 않습니다). (TC39)
MDN은 "얕은 복사"와 "희소 배열의 빈 슬롯에 대해 호출되지 않음" 모두에 대해 명시적으로 설명합니다. (MDN 웹 문서)
또한 ECMAScript 사양에서는 누락된 요소에 대해 콜백이 호출되지 않는다고 명시적으로 언급하고 있습니다. (TC39)
보안 파이프라인에서 희소 배열이 중요한 이유
스파스 배열은 예상보다 더 많이 나타납니다: JSON 변환, '인덱스 삭제' 버그, 다중 소스 병합의 부분적인 결과 또는 순진한 중복 제거 등입니다.
const results = [ {id: 1}, , {id: 3} ]; // 구멍에 주목하세요.
const kept = results.filter(() => true);
console.log(kept); // [{id: 1}, {id: 3}] (구멍 사라짐)
파이프라인이 "동일한 길이 입력, 동일한 길이 출력"을 가정하는 경우 스파스 배열은 이를 깨뜨릴 수 있습니다. 분류 파이프라인에서 이는 다음과 같이 해석될 수 있습니다. 침묵 데이터 손실.
고CTR 패턴: 오브젝트 배열 필터링하기
대부분의 실제 '자바스크립트 필터' 사용법은 개체 배열(자산/검색/IOC)을 필터링하는 것입니다.
예: 증거가 첨부된 악용 가능한 웹 검색 결과만 보관하세요.
const findings = [
{ id: "XSS-001", type: "XSS", 심각도: "높음", 확인됨: true, 증거: ["req.txt", "resp.html"] },
{ id: "INFO-009", type: "배너", 심각도: "정보", 확인됨: 거짓, 증거: [] },
{ id: "SSRF-004", type: "SSRF", 심각도: "중요", 확인됨: true, 증거: ["dnslog.png"] },
];
const actionable = findings.filter(f =>.
f.verified &&
(f.심각도 === "높음" || f.심각도 === "중요") &&
f.evidence?.length > 0
);
console.log(actionable.map(f => f.id)); // ["XSS-001", "SSRF-004"]
예: 범위 제어(프로그램을 망치기 가장 쉬운 곳)
const inScopeHosts = 새로운 Set(["api.example.com", "admin.example.com"]);
const assets = [
{ host: "api.example.com", ip: "203.0.113.10", alive: true },
{ host: "cdn.example.com", ip: "203.0.113.11", alive: true },
{ host: "admin.example.com", ip: "203.0.113.12", alive: false },
];
const target = assets
.filter(a => a.alive)
.filter(a => inScopeHosts.has(a.host));
console.log(targets);
// [{host:"api.example.com", ...}]
사용 설정 우발적인 O(n²) 패턴 (포함() 내부 filter() 대규모 배열에서). 이는 수만 개의 자산을 필터링할 때 중요합니다.
성능 현실: 꽉 찬 배열과 텅 빈 배열, 그리고 조금만 신경 써야 하는 이유
V8은 잘 알려진 차이점이 있습니다. 포장 그리고 holey 배열에 대한 연산은 일반적으로 빈 배열보다 더 효율적입니다. (V8)
보안에 미치는 영향: 구멍을 만드는 파이프라인(delete arr[i], 희소 병합)은 성능을 저하시킬 수 있습니다. 그리고 정확성. 실제 규칙은 간단합니다:
- 구멍을 만들지 마세요. 선호
스플라이스,필터를 클릭하거나 배열을 다시 빌드합니다. - 대규모 데이터 집합을 처리하는 경우 핫 배열에 유형을 혼합하지 마세요.
보안 엔지니어의 의사 결정 표입니다: 필터 vs 일부 vs 찾기 vs 감소
| 보안 파이프라인의 목표 | 최고의 도구 | 왜 | 일반적인 실수 |
|---|---|---|---|
| 모든 매치 유지(후보 목록) | filter() | 하위 집합 배열을 반환합니다. | 술어 중 소스 변경 |
| 첫 번째 일치에서 중지(정책 게이트) | 일부() | 조기 종료 부울 | filter().length > 0 |
| 첫 번째 매치 가져오기(경로 선택) | find() | 조기 종료 + 요소 | filter()[0] |
| 메트릭(개수, 점수) 구축하기 | reduce() | 원패스 집계 | 감속기에서 고가의 I/O 수행 |
이는 스타일보다는 파이프라인을 결정론적이고 모든 곳에서 실행할 수 있을 만큼 저렴하게 만드는 것입니다(CI, 브라우저 샌드박스, 에이전트 러너).
위험한 과부하: "필터링"은 "살균"이 아닙니다.
이제 보안 엔지니어가 무자비하게 다뤄야 할 부분입니다: 문자열 필터링은 보안 경계가 아닙니다..
OWASP의 XSS 예방 지침은 다음과 같이 강조합니다. 출력 인코딩 (입력 필터링에 의존하기보다는 상황에 맞는 적절한 방어를 사용해야 합니다. (OWASP 치트 시트 시리즈)
OWASP의 자체 XSS 필터 회피 콘텐츠는 입력 필터링을 불완전한 방어 수단으로 명시적으로 규정하고 우회 방법을 목록화합니다. (OWASP 치트 시트 시리즈)
포트스위거의 XSS 치트 시트(2025년 10월 업데이트)도 마찬가지로 WAF와 필터를 우회하는 벡터가 포함되어 있다고 명시하고 있습니다. (포트스위거)
현실적인 예시입니다: 구문 분석 차이에 따라 축소되는 URL '필터'
나쁜 패턴:
함수 allowUrl(u) {
return !u.includes("javascript:") && !u.includes("data:");
}
더 나은 패턴: 구문 분석 + 허용 목록 + 정규화:
함수 allowUrl(u, allowedHosts) {
const url = new URL(u, ""); // 상대적 입력을 위한 안전한 기반
if (!["https:"].includes(url.protocol)) return false;
return allowedHosts.has(url.hostname);
}
const allowedHosts = new Set(["docs.example.com", "cdn.example.com"]);
이것이 바로 정신적 변화입니다: 문자열 일치 중지를 클릭하고 구조화된 데이터의 유효성 검사를 시작합니다.
'필터/소독제'의 생산 실패를 증명하는 CVE와 이를 수표에 포함해야 하는 이유
조직에서 "HTML을 위생 처리합니다"라고 하면 위협 모델에 즉시 포함되어야 합니다: 어떤 소독제, 어떤 버전, 어떤 설정, 어떤 우회 이력이 있나요?
CVE-2025-66412(앵귤러 템플릿 컴파일러 저장 XSS)
NVD는 불완전한 내부 보안 스키마로 인해 Angular의 템플릿 컴파일러에 저장된 XSS를 설명하며, 이는 Angular의 내장된 살균을 우회할 수 있습니다(패치된 버전에서 수정됨). (NVD)
보안 팁: "프레임워크 살균"은 영구적인 보장이 아닙니다. 버전, 권고, 회귀 테스트 등 다른 보안 제어와 마찬가지로 취급하세요.

CVE-2025-26791(잘못된 정규식을 통한 DOMPurify mXSS)
NVD에 따르면 3.2.4 이전의 DOMPurify에는 잘못된 템플릿-리터럴 정규식이 있어 경우에 따라 변이 XSS를 유발할 수 있습니다. (NVD)
보안 팁: 세니타이저 옵션이 중요합니다. 구성 콤보는 "존경받는 라이브러리를 사용하는" 경우에도 익스플로잇 조건을 만들 수 있습니다.
CVE-2024-45801(돔 퓨리파이 깊이 검사 바이패스 + 프로토타입 오염 약화)
NVD는 특수 중첩 기술이 깊이 검사를 우회할 수 있고 프로토타입 오염이 이를 약화시킬 수 있다고 보고했으며, 이후 버전에서 수정되었습니다. (NVD)
보안 팁: 휴리스틱(깊이 제한, 중첩 검사)에 의존하는 방어는 종종 우회 타깃이 됩니다.
CVE-2025-59364(익스프레스-xss-새니타이저 리커버리 DoS)
중첩된 JSON 요청 본문을 살균하는 동안 무제한 재귀 깊이가 제한되지 않음, GitHub 권고 사항의 영향 및 수정된 버전에 대해 자세히 설명합니다. (NVD)
보안 팁: "위생 처리" 코드는 가용성 버그를 일으킬 수 있습니다. 공격자는 서비스를 안정적으로 중단시킬 수 있다면 XSS가 필요하지 않습니다.
펜테스트 자동화를 위한 실용적인 '자바스크립트 필터' 패턴
1) 신뢰도 게이팅: 고비용 검증을 위해 신뢰도가 높은 후보만 유지합니다.
const candidates = [
{ id: "C1", signal: 0.92, cost: 3.0 },
{ id: "C2", signal: 0.55, cost: 1.2 },
{ id: "C3", signal: 0.81, cost: 9.5 },
];
const 예산 = 10;
const shortlist = 후보자
.filter(c => c.signal >= 0.8) // 신뢰 임계값
.filter(c => c.cost c.id)); // ["C1"]
2) 증거의 완전성: 증거 없이 보고서를 보내지 마세요.
const reportItems = findings.filter(f =>.
f.verified &&
Array.isArray(f.evidence) &&
f.evidence.length >= 1
);
3) 킬 스위치 필터: 익스플로잇 단계 전에 정책 적용
사용 일부() 를 '일치하는 항목이 있으면 거부'로 설정합니다:
const forbidden = [/\\.gov$/i, /\\.mil$/i];
const isForbidden = host => forbidden.some(rx => rx.test(host));
펜리전트가 적합한 분야
'증거 우선' 워크플로에서, filter() 는 다음과 같은 경우에 좋습니다. 결정론적 오케스트레이션다음에 무엇을 검증할지, 어떤 경로를 탐색할지, 최종 보고서에 어떤 내용을 포함할지 결정합니다. 어려운 부분은 검증 루프, 즉 실행을 재현하고 증거를 수집하며 여러 실행에서 일관된 결과를 유지하는 것입니다.
코드에서 후보를 필터링한 다음 자동화된 시스템을 사용하여 검증하고, 증거를 캡처하고, 여러 환경에서 일관된 실행을 유지하는 것은 AI 기반 펜테스트 플랫폼이 자연스럽게 적합할 수 있는 분야입니다. AI 펜테스트 플랫폼으로서 펜리젠트의 포지셔닝은 특히 파이프라인의 '검증 + 증거 + 보고' 부문에서 의미가 있습니다.
Penligent: https://penligent.ai/

'자바스크립트 필터' 사용 보안 등급을 유지하기 위한 간단한 체크리스트
- 치료
filter()as 데이터 정형화"입력 위생 처리"가 아닌 "입력 위생 처리"입니다. - 빈 슬롯에 대해서는 콜백을 건너뛰는 것을 기억하세요. (TC39)
- 사용
설정/지도를 사용하여 대규모 멤버십 필터를 만들 수 있습니다. - 선호
일부()/find()조기 종료가 필요한 경우. - XSS 방어를 위해서는 블랙리스트 필터가 아닌 OWASP의 컨텍스트 기반 인코딩 지침을 따르세요. (OWASP 치트 시트 시리즈)
- 살균제/프레임워크 CVE를 일급 공급망 리스크로 추적하세요. (NVD)
참조 및 권위 있는 링크(복사/붙여넣기)
- MDN
Array.prototype.filter(): https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Array/filter (MDN 웹 문서) - 누락된 요소 건너뛰기에 대한 ECMAScript 사양 참고 사항: https://tc39.es/ecma262/multipage/indexed-collections.html (TC39)
- V8 "요소 종류"(포장된 대 홀리): https://v8.dev/blog/elements-kinds (V8)
- 스택 오버플로 "자바스크립트 필터 객체 배열" (228천 회 조회): https://stackoverflow.com/questions/13594788/javascript-filter-array-of-objects (스택 오버플로)
- OWASP XSS 예방 치트 시트: https://cheatsheetseries.owasp.org/cheatsheets/Cross_Site_Scripting_Prevention_Cheat_Sheet.html (OWASP 치트 시트 시리즈)
- OWASP XSS 필터 회피 치트 시트: https://cheatsheetseries.owasp.org/cheatsheets/XSS_Filter_Evasion_Cheat_Sheet.html (OWASP 치트 시트 시리즈)
- 포트스위거 XSS 치트 시트 (2025): https://portswigger.net/web-security/cross-site-scripting/cheat-sheet (포트스위거)
- NVD CVE-2025-66412(앵귤러 저장 XSS): https://nvd.nist.gov/vuln/detail/CVE-2025-66412 (NVD)
- 앵귤러 어드바이저리(CVE-2025-66412): https://github.com/angular/angular/security/advisories/GHSA-v4hv-rgfq-gp49 (GitHub)
- NVD CVE-2025-26791(DOMPurify mXSS): https://nvd.nist.gov/vuln/detail/CVE-2025-26791 (NVD)
- NVD CVE-2024-45801(DOMPurify 깊이 검사 바이패스): https://nvd.nist.gov/vuln/detail/CVE-2024-45801 (NVD)
- NVD CVE-2025-59364(익스프레스-xss-새니타이저 DoS): https://nvd.nist.gov/vuln/detail/CVE-2025-59364 (NVD)
- GitHub 자문 GHSA-hvq2-wf92-j4f3: https://github.com/advisories/GHSA-hvq2-wf92-j4f3 (GitHub)

