Puan ders bitince hesaba yazılır. Bu dersi tamamlayınca +50 XP alacaksın. Giriş yapmadan ilerlersen puan yalnız bu tarayıcıda durur.
Bağlama göre çıktı kodlama
Doğrulanmış veri güvenli veri demek değildir. AltayKargo iade servisinde açıklama alanı beş yüz karaktere kadar serbest metin kabul eder ve bu doğru bir karardır, çünkü müşteri hasarı kendi cümleleriyle anlatır. Ama aynı metin durum sayfasında görüntülenirken sorun çıkarır. Müşteri açıklamaya bir betik parçası yazarsa ve sayfa bu metni doğrudan HTML'e basarsa, tarayıcı onu kod sanıp çalıştırır. Bu saldırıya siteler arası betik çalıştırma denir, kısaca XSS. Kök neden veri ile kod arasındaki sınırın karışmasıdır. Çözüm girdiyi kısıtlamak değil, çıktıyı bastığın yere göre kodlamaktır. Aynı kök neden, modülün önceki dersinde gördüğün izin listesiyle de çözülmez; izin listesi girdiyi kısıtlar, çıktı kodlama ise gösterimi güvenli hale getirir.
Kodlama kuralı, bastığın bağlama göre değişir. HTML gövdesine metin basarken küçüktür, büyüktür ve ve işaretini varlığa çevirirsin. HTML özniteliği içinde tırnak işareti de aynı derecede önemlidir. JavaScript string'i içine basarken farklı bir kaçış kuralı, URL parametresi içinde ise yüzde kodlaması geçerlidir. Tek bir kaçış fonksiyonu bu dört bağlama birden yetmez. Modern arayüz kütüphaneleri, metni HTML gövdesine basarken varsayılan olarak otomatik kodlar; risk genelde ham HTML basmaya izin veren özel fonksiyonlarda ortaya çıkar. Bu dört bağlamı karıştırmak, bir yerde fazladan kodlama yaparak veriyi bozmaya, başka bir yerde hiç kodlamayarak açık bırakmaya yol açar.
// durum sayfası (sunucu tarafı şablon)
res.send(`<div class='aciklama'>${iade.aciklama}</div>`);const kacir = (s) => s.replace(/&/g, "&").replace(/</g, "<").replace(/>/g, ">");
res.send(`<div class='aciklama'>${kacir(iade.aciklama)}</div>`);kacir fonksiyonu üç özel karakteri HTML varlığına çevirir; tarayıcı bunları artık etiket değil, düz metin olarak okur. Bu üç karakter yalnız metin içeriği için yeterlidir, aynı değer bir öznitelik içine ya da bir JavaScript string'ine basılacaksa ayrı bir kodlayıcı gerekir. React ve Vue gibi kütüphaneler bu işi arka planda otomatik yapar; elle yazmak genelde yalnız eski sunucu şablonlarında gerekir. Tam bir kütüphane ayrıca tırnak işaretlerini de kaçışlar, çünkü öznitelik bağlamında tırnak kırılması ayrı bir açık türüdür.