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.
Veri KAYDEDİLİRKEN kaçış uygulamak, klasik hatadır: aynı değerin sonra bir posta, bir dışa aktarma ya da bir API için kaçışının geri alınması gerekir ve o yollardan biri bunu hep unutur. Yazılanı olduğu gibi saklayın; gösterirken kaçış uygulayın.

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

Öntanımlı olarak kaçış uygulayan bir şablon motoru, bu arıza sınıfının büyük kısmını ortadan kaldırır. Sizinki öyleyse, savunabileceğiniz bir sebep olmadan "ham bas" yardımcısına uzanmayın.