← 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.