Bir ziyaretçi, sayfanıza başka ziyaretçilerin göreceği bir metin koyabiliyorsa ve o metne kaçış uygulanmıyorsa, oraya metin yerine bir betik koyabilir. O betik sizin siteniz kimliğiyle, ziyaretçinizin oturumuyla çalışır ve o ziyaretçinin yapabildiği her şeyi yapabilir.
Nereden gelir
- Bir yorum, bir ad, bir değerlendirme - birinin yazıp bir başkasına gösterilen her şey.
- Sayfaya geri basılan bir adres parametresi; yani neredeyse her sitedeki arama kutusu.
- Yüklenmiş bir dosyanın adı.
- Denetiminizde olmayan bir API'den gelen veriler.
Alışkanlık
ÇIKIŞTA kaçış uygulayın, her seferinde, hangi bağlama basıyorsanız ona göre. Girişte değil - aynı veri HTML'e de, bir özniteliğe de, JavaScript'e de basılabilir ve her biri başka türlü bir kaçış ister.
echo htmlspecialchars($name, ENT_QUOTES, 'UTF-8');
- HTML metninde - ENT_QUOTES ile htmlspecialchars.
- Bir öznitelikte - aynısı, üstelik özniteliği her zaman tırnak içine alın.
- JavaScript'te - json_encode; dizgeleri uç uca eklemek asla olmaz.
- Bir adreste - urlencode.
İkinci bir katman
add_header Content-Security-Policy "default-src 'self'; script-src 'self'" always;
CSP, tarayıcıya betikleri yalnızca kendi kaynağınızdan çalıştırmasını söyler; böylece araya sokulmuş satır içi bir betik, biri sızsa bile çalışmaz. Önce yalnızca rapor kipinde devreye alın, yoksa kendi sayfanızı bozarsınız.
Sınayın
Her alana zararsız bir işaret koyun ve onu gösteren sayfanın KAYNAĞINA bakın. İşaretinizi metin olarak görmek doğrudur; onu bir etiket olarak görmek ise arızanın kendisidir.
