DOM-based XSS/tr

DOM tabanlı XSS hakkında
DOM tabanlı XSS ​​(veya tür-0 XSS), istemci tarafındaki betikleri (JavaScript gibi) sayfanın DOM 'u değiştirip bir saldırganın JavaScript çalıştırmasına izin verdiğinde kurbanın tarayıcısında meydana gelen bir saldırı türüdür.

Sunucu çalıştırılabilir JavaScript'i tarayıcıya döndürmediğinden, bu XSS sınıfı Reflective XSS (tip-1 XSS) ve Stored XSS'den (tip-2 XSS) farklıdır. Bunun yerine, sunucu tarafından temizlenmiş veya muhtemelen sunucuya hiç gönderilmemiş veriler, sayfada çalışan mevcut kod tarafından çalıştırılabilir JavaScript'e dönüştürülür.

Örneğin, OWASP web sitesinden şu örnek betiğini düşünün:

... Dilinizi seçiniz: document.write(""+document.location.href.substring(document.location.href.indexOf("default=")+8)+""); document.write("English"); ...

Sayfa, amaçlanan dil dizesi yerine " alert("xss") " olarak ayarlanmış "default" parametresi ile yüklenirse, fazladan betik sayfanın DOM'sine eklenir ve sayfa yüklenirken çalıştırılır.

Önleme
JavaScript, resmi bir kod inceleme süreci olmadan MediaWiki sitelerine eklenebilse de, bu betikleri, bu saldırıları engellemezlerse diğer kullanıcıları tehlikeye atabilir.

Standart XSS önlemede olduğu gibi, mümkün olduğunda gelen verileri doğrulamalısınız ve betiğiniz sayfaya yazarken her zaman verilerden çıkmalısınız. Bu kaçmayı yapmak için, kaçmayı zorlaştıran bazı yöntemler kullanmaktan kaçınmalı ve bunun yerine HTML yapısının ve değerlerinin veya metnin ayrılmasını kolaylaştıran yöntemler kullanmalısınız.

JavaScript için bilgi sağlamak amacıyla veri özniteliklerini kullanmak cazip gelebilir. Bu genellikle iyi bir uygulamadır, ancak kullanıcıların keyfi veri özniteliklerine sahip öğeler yapmalarına da izin verildiğini unutmayın, bu nedenle bir veri özniteliğinden alınan herhangi bir bilgi (örneğin, jQuery'nin kullanılarak) güvenilmeyen girdi olarak değerlendirilmeli ve doğrulanmalıdır.

Kacının
Genel olarak, bu işlevlerden mümkünse kaçınılmalıdır. Güvenli hale getirilebilirler, ancak tüm XSS vektörlerinin hafifletildiğinden emin olmak için her tarayıcının JavaScript motorunun nasıl çalıştığını anlamayı gerektirir.

Element,  ve   yöntemler

JQuery'nin  yöntemi (.innerHTML kullanan)

JQuery öğesi oluşturmada kullanıcı verilerini kullanma

jQuery'nin append yöntemi, eklediğiniz her düğümün veya nesnenin türü ve değerinden emin olmadığınızda. Bir (görünen) HTML dizesi ise, jQuery bunu örtük olarak bir öğeye dönüştürür.

veya

,, bir nesnenin olay işleyicisi veya   url hedeflerine iletilen bir dizede kullanıcı verilerini kullanma

Kullanıcı verilerini CSS oluşturan dizelerde kullanma

Kullanım
Sayfanın DOM'unu güncellerken, DOM öğeleri oluşturmak ve bunları DOM'a eklemek için genellikle bu işlev modelini kullanmanız gerekir:

Gösterildiği gibi, öğeyi ve kullanıcı tarafından kontrol edilen verileri içermeyen herhangi bir özelliği oluşturmak için  kullanabilirsiniz. Öğenin özniteliklerini ayarlamak için kullanabilirsiniz.

Doğru oluşturulmuş bir öğeniz olduğunda, öğeyi DOM'a eklemek için veya  kullanabilirsiniz. Ancak yukarıda bakın; Tam olarak ne eklediğinizi bilmiyorsanız append veya appendTo kullanmayın.

yöntemi, bir öğenin metin gövdesini ayarlamak için kullanılabilir ve herhangi bir HTML'den doğru bir şekilde çıkacaktır.

JQuery kullanmıyorsanız, kullanabilirsiniz

JavaScript, hangi dizelerin öğe adlarını, özellik adlarını ve öznitelik değerlerini temsil etmesi gerektiğini açıkça yorumlayabildiğinden, kullanıcı tarafından kontrol edilen verilere eklenmiş olabilecek tüm HTML karakterlerini doğru bir şekilde değiştirecektir.

Sanitizasyon
Kullanıcı tarafından kontrol edilen verileri HTML ile karıştırmanız gereken zamanlar olabilir. Bu gibi durumlarda, kullanıcı tarafından kontrol edilen verilerin eklendiği HTML bağlamı için uygun şekilde kaçtığından emin olmanız gerekir.

Örneğin, bir div öğesinin metnine veri eklemek:

Bu kullanıcı tarafından kontrol edilen verileri div öğesinin id özniteliğine eklemenize göre farklı çıkış gerektirir.

Bağlamların ve kaçış kurallarının bir listesi OWASP XSS Önleme Hile Sayfasında bulunabilir.

En basit durum için (bir öğenin metnine kullanıcı tarafından kontrol edilen verileri eklemek), jQuery'nin yöntemini veya   kullanabilirsiniz.