Production'da ayrıntılı hata sayfaları ve stack trace'ler
Yakalanmamış bir exception veya var olmayan bir route'a yönelik bir yoklama production'da bir framework'ün debug hata görünümünü tetiklediğinde, saldırgana sunucunun haritasını verebilir: dosya yolları, satır numaraları, kütüphane sürümleri ve bazen environment değişkenleri. Çözüm, kullanıcılara genel hata yanıtları döndürürken tüm ayrıntıları yalnızca ekibinin kontrol ettiği sunucu taraflı bir servise log'lamaktır.
Nedir
Her web framework'ü yerleşik bir debug hata görünümüyle gelir — Django'nun sarı exception sayfası, Laravel'in Ignition ekranı, Next.js'in geliştirme overlay'i, Express'in varsayılan exception dökümü. Bunlar geliştirme sırasında paha biçilmezdir, ancak production build'lerinde kasıtlı olarak devre dışı bırakılır. Risk, debug modu kapatılmadığı için aktif kalan framework hata sayfaları veya ham exception nesnelerini doğrudan yanıt gövdesinde döndüren özel hata handler'larıdır.
AppSafe, sitende var olmaması gereken bir yolu isteyerek ayrıntılı hataları tespit eder. Yanıt gövdesi framework hata sayfalarında yaygın olan kalıplarla — Python traceback'leri, Node.js exception dökümleri, .NET exception ayrıntıları, Rails.root yolları veya benzerleri — eşleşirse, bulgu Hata Yönetimi ve Dayanıklılık kategorisinde orta önem derecesiyle raporlanır.
Neden önemli
Bir stack trace; dil ve framework sürümünü, uygulamanın dahili dizin yapısını, hatanın oluştuğu tam dosya ve satırı ve oraya götüren çağrı zincirini açığa çıkarır. Bir CVE veritabanıyla birleştiğinde bu bilgi, keşiften hedefli bir istismara kadar geçen süreyi kısaltır — özellikle belirli framework veya kütüphane sürümlerindeki bilinen zafiyetler için.
Debug sayfaları ayrıca işlenmiş çıktıda istek verilerini, kısmi environment değişkenlerini veya SQL parçalarını da içerebilir; bu da kullanıcı girdisini veya asla tarayıcıya ulaşmaması gereken sunucu içi değerleri istemeden sızdırır.
Nasıl düzeltilir
Next.js API route'larında ve Route Handler'larında exception'ları açıkça yakala, tüm hatayı sunucu tarafında log'la ve çağırana genel bir durum kodu döndür.
// app/api/example/route.ts
export async function GET() {
try {
// ... handler logic ...
} catch (err) {
console.error(err); // logs stack trace to your server/monitoring only
return new Response("Internal Server Error", { status: 500 });
}
}Next.js, production'da yakalanmamış hatalar için pages/500.tsx'i (App Router'da app/error.tsx) render eder. Bu sayfayı teknik ayrıntı içermeyen dostane bir mesajla doldur ve gerçek exception'ı yakalamak için Sentry gibi bir hata izleme servisi bağla.
Uygulama katmanından kaçan her hata için nginx, tüm 5xx yanıtlarını tarayıcıya ulaşmadan önce statik bir sayfayla değiştirebilir.
error_page 500 502 503 504 /50x.html;
location = /50x.html {
root /usr/share/nginx/html;
internal;
}SSS
Next.js production build'lerinde stack trace gösterir mi?
Geliştirme overlay'i production'da zaten bastırılır. Asıl risk, bir exception'ı yakalayıp doğrudan yanıta serialize eden özel Route Handler'lar veya API route'larıdır — framework bunu kendi başına engellemez.
AppSafe ayrıntılı hataları nasıl yokluyor?
Sitende var olmayan bir URL ister ve yanıt gövdesinde 'Traceback (most recent call last)', 'Stack trace:', 'Unhandled Runtime Error', 'Exception Details:' gibi ifadeleri ve Python, Node.js, PHP, Java, Ruby ve .NET framework'lerinden benzer işaretleri arar.
404 sayfam stack trace göstermiyor ama AppSafe yine de işaretledi. Neden?
Tarayıcı geniş bir kalıp kümesiyle eşleşme yapar ve bunların bazıları kısmi veya maskelenmiş hata yanıtlarında da görünür. 404 veya 500 yanıt gövdende exception sınıf adlarının, dahili dosya yollarının veya framework tanımlayıcılarının herhangi bir yerde — bir yorumda veya gizli bir öğede bile — görünüp görünmediğini kontrol et.
Uygulaman etkileniyor mu?
AppSafe, bunu ve onlarca başka sorunu tek bir ücretsiz taramada kontrol eder.
Uygulamamı ücretsiz taraİlgili rehberler
Production'daki source map'ler kaynak kodunu sızdırır
Yayınlanan .map dosyaları orijinal kaynağını teslim eder.
Tehlikeli HTTP yöntemleri: TRACE, PUT ve DELETE nasıl duyurulur
TRACE veya DELETE listeleyen bir OPTIONS yanıtı olması gerekenden fazlasını açığa çıkarır.
Herkese açık GraphQL introspection: neden sorun ve nasıl kapatılır
Tek bir sorgu tüm şemanı döndürür. Production'da kapat.