Skip to content
Open
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
4 changes: 4 additions & 0 deletions .jules/sentinel.md
Original file line number Diff line number Diff line change
Expand Up @@ -47,3 +47,7 @@
**Vulnerability:** μ‚¬μš©μž μž…λ ₯κ°’(`lang`)을 검증 없이 `console.warn`κ³Ό 같은 둜그 ν•¨μˆ˜μ— κ·ΈλŒ€λ‘œ λ³΄κ°„ν•˜μ—¬ 좜λ ₯ν•  경우, 둜그 μΈμ μ…˜(Log Forging) 곡격에 λ…ΈμΆœλ  수 있음.
**Learning:** μ‚¬μš©μž μž…λ ₯이 ν¬ν•¨λœ λ¬Έμžμ—΄μ„ 직접 λ³΄κ°„ν•˜λ©΄ μ•…μ˜μ μΈ νŽ˜μ΄λ‘œλ“œκ°€ 둜그 νŒŒμΌμ— μ£Όμž…λ˜μ–΄ 둜그 뢄석 μ‹œμŠ€ν…œμ„ λ°©ν•΄ν•˜κ±°λ‚˜ λ‹€λ₯Έ 취약점을 연계할 수 있음.
**Prevention:** 둜그λ₯Ό 남길 λ•ŒλŠ” κ²€μ¦λ˜μ§€ μ•Šμ€ μ™ΈλΆ€ μž…λ ₯값을 λ™μ μœΌλ‘œ λ¬Έμžμ—΄μ— μ£Όμž…(Interpolation)ν•˜λŠ” λŒ€μ‹ , 사전에 μ •μ˜λœ 정적이고 μ•ˆμ „ν•œ λ©”μ‹œμ§€λ‘œ λŒ€μ²΄ν•΄μ•Ό 함.
## 2026-08-28 - DOM API μ˜ˆμ™Έ 처리 λˆ„λ½ λ°©μ–΄
**Vulnerability:** DOM μš”μ†Œλ₯Ό 탐색할 λ•Œ (예: `document.getElementById`, `element.closest`) κ²°κ³Όκ°€ null인지 ν™•μΈν•˜μ§€ μ•Šκ³  속성을 λ³€κ²½ν•˜κ±°λ‚˜ λ©”μ„œλ“œλ₯Ό ν˜ΈμΆœν•˜μ—¬ λ°œμƒν•˜λŠ” unhandled script exception.
**Learning:** 정적 μ›Ήμ‚¬μ΄νŠΈ ν”„λ‘ νŠΈμ—”λ“œ μ½”λ“œμ—μ„œ DOM μš”μ†Œλ₯Ό μ‘°νšŒν•  λ•Œ, ν•΄λ‹Ή μš”μ†Œκ°€ μ‘΄μž¬ν•˜μ§€ μ•ŠμœΌλ©΄ `TypeError`κ°€ λ°œμƒν•˜μ—¬ 슀크립트 싀행이 쀑단될 수 μžˆμŠ΅λ‹ˆλ‹€. 이λ₯Ό DoS μ·¨μ•½μ μœΌλ‘œ μ·¨κΈ‰ν•˜μ§€λŠ” μ•ŠμœΌλ‚˜(λ³΄μ•ˆ κ·Ήμž₯ λ°©μ§€), 방어적 ν”„λ‘œκ·Έλž˜λ° κ΄€μ μ—μ„œ μš°μ•„ν•œ κΈ°λŠ₯ μ €ν•˜(graceful degradation)λ₯Ό μœ„ν•΄ null 체크가 ν•„μˆ˜μ μž…λ‹ˆλ‹€.
**Prevention:** Vanilla JavaScriptμ—μ„œ DOM API둜 μš”μ†Œλ₯Ό μ‘°νšŒν•œ ν›„ 속성 λ³€κ²½μ΄λ‚˜ λ©”μ„œλ“œ ν˜ΈμΆœμ„ μˆ˜ν–‰ν•˜κΈ° 전에 항상 λ°˜ν™˜κ°’μ΄ null이 μ•„λ‹Œμ§€ κ²€μ¦ν•˜λŠ” 방어적 ν”„λ‘œκ·Έλž˜λ° νŒ¨ν„΄μ„ μ μš©ν•΄μ•Ό ν•©λ‹ˆλ‹€.
15 changes: 13 additions & 2 deletions components/krds-gallery.js
Original file line number Diff line number Diff line change
Expand Up @@ -6,12 +6,23 @@
tabList.forEach((t) => {
const sel = t === tab;
t.setAttribute("aria-selected", sel);
document.getElementById(t.getAttribute("aria-controls")).hidden = !sel;
const targetId = t.getAttribute("aria-controls");
if (targetId) {
const target = document.getElementById(targetId);
if (target) {
target.hidden = !sel;
}
}
});
});
});
});
// Tag remove
document.querySelectorAll(".krds-tag__remove").forEach((btn) =>
btn.addEventListener("click", () => btn.closest(".krds-tag").remove())
btn.addEventListener("click", () => {
const tag = btn.closest(".krds-tag");
if (tag) {
tag.remove();
}
})
);
Loading