← nitronium.dev
startsWith() ile path izin kontrolü path traversal'a açık
2026-06-15
Dosya yazma yetkisi kontrol ederken sık yapılan hata: normalize etmeden startsWith() kullanmak.
`ts
// YANLIŞ — bypass'a açık
function isPathAllowed(p: string) {
return ROOTS.some(root => p.startsWith(root));
}
`
Bu kontrolü /Users/foo/.claude/skills/../../etc/passwd gibi bir path kolayca geçer. String olarak baktığında başlangıç doğru görünür; ama gerçek hedef farklı bir yer.
Doğrusu üç adım:
`ts
function isPathAllowed(filePath: string): boolean {
if (filePath.includes('..')) return false; // 1. ön kontrol
const abs = resolve(WORK_DIR, filePath); // 2. normalize
return ROOTS.some(r => abs === r || abs.startsWith(r + sep)); // 3. karşılaştır
}
`
resolve() tüm .. segmentlerini eritir. Root listesi de map(r => resolve(r)) ile normalize edilmeli; yoksa WORK_DIR/../other gibi root tanımları da aynı sorunu taşır.
path.sep kullanmak önemli: /Users/foo ile /Users/foobar arasındaki farkı startsWith('/Users/foo') ayırt edemez, ama startsWith('/Users/foo/') eder.