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. If it is a string of (apparent) HTML, jQuery will implicitly convert it to an element.

or

Using user data in a string passed to,  , an object's event handler, or   url targets

Using user data in strings that generate CSS

Use
When updating the page's DOM, you should typically use this pattern of functions for creating DOM elements and inserting them into the DOM:

As shown, you can use  to create the element, and any attributes that do not include user-controlled data. You can also use to set the element's attributes.

When you have a correctly constructed element, you can use or  to insert the element into the DOM. But see above; do not use append or appendTo if you do not know exactly what you are appending.

The method can be used to set the text body of an element, and will correctly escape any HTML.

If you're not using jQuery, you can use

Because the JavaScript is able to clearly interpret what strings are meant to represent element names, attribute names, and attribute values, it will correctly escape any HTML characters that may have been inserted into user-controlled data.

Sanitization
There may be times when you will need to mix user-controlled data with HTML. In those cases, you will need to ensure that the user-controlled data is properly escaped for the HTML context where it is being inserted.

For example, inserting data into the text of a div element:

Requires different escaping than if you insert that user-controlled data into the id attribute of the div element.

A list of contexts and escaping rules can be found in the OWASP XSS Prevention Cheat Sheet

For the most simple case (inserting user-controlled data into the text of an element), you can use jQuery's method or.