Güvenlik incelemesi
Kod parçası için güvenlik bulguları ve düzeltmeler.

Prompt Metni
Aşağıdaki Next.js Route Handler'ı XSS, SSRF, gizli bilgi sızıntısı ve yetkilendirme açısından incele. Her bulguya önem derecesi ver ve kısa düzeltme örnekleri sun.
export async function POST(request: Request) {
const { url, userId } = await request.json()
const response = await fetch(url)
const text = await response.text()
return Response.json({
html: '<div>' + text + '</div>',
apiKey: process.env.INTERNAL_API_KEY,
owner: userId,
})
}Prompt Sonucu
1. Critical — Gizli bilgi sızıntısı
INTERNAL_API_KEY doğrudan istemciye dönüyor.
Düzeltme:
return Response.json({ html: safeText })
2. High — SSRF
Kullanıcı kontrollü url; localhost, metadata servisi veya iç ağ adreslerine istek gönderebilir.
Düzeltme:
const allowedHosts = new Set(['api.example.com'])
const target = new URL(url)
if (target.protocol !== 'https:' || !allowedHosts.has(target.hostname)) {
return Response.json({ error: 'Geçersiz hedef.' }, { status: 400 })
}
3. High — Yetkilendirme
userId istek gövdesinden geldiği için saldırgan başka bir kullanıcıyı taklit edebilir.
Düzeltme:
const session = await requireSession()
const owner = session.user.id
4. Medium — Saklı XSS
HTML metni JSON içinde dönse de istemci bunu dangerouslySetInnerHTML ile basarsa script çalışabilir. Dış yanıt güvenilir kabul edilmemelidir.
Düzeltme:
return Response.json({ text })
İstemci metni normal JSX ifadesiyle göstermelidir: <div>{data.text}</div>. HTML gösterimi zorunluysa güvenilir bir sanitizer ve katı Content Security Policy kullanılmalıdır.
Ek kontroller:
- İstek zaman aşımı ve maksimum yanıt boyutu belirlenmeli.
- response.ok kontrol edilmeli.
- Route erişimi kimlik doğrulamasıyla sınırlandırılmalı.
- Hedef servis için redirect davranışı ayrıca doğrulanmalıdır.