Prototip Kirliliği Saldırıları Nasıl Önlenir?

Prototip Kirliligi Saldirilari Nasil Onlenir



Prototip kirliliği saldırısı, JavaScript nesnelerinin ilgili prototiplerle başa çıkma biçiminden yararlanır. JavaScript'te Prototipler, seçilen nesnenin varsayılan özelliklerini ve yöntemlerini tanımlayan başka bir nesnedir. Saldırgan, nesnenin özelliklerini değiştirerek veya nesneleri yinelemeli olarak birleştiren bir işlev kullanarak bu prototiplere kötü amaçlı kod enjekte ederek prototip kirliliğinden yararlanır.

Bu kılavuzda prototip kirliliği saldırılarını önlemenin yolları açıklanmaktadır.







Prototip Kirliliği Saldırılarını Önlemek mi?

Prototip kirliliği saldırılarının temel nedeni, JavaScript nesnelerinin özelliklerini prototiplerinden devralmasıdır. Bu, bir saldırganın prototipe kötü amaçlı kod enjekte etmesi halinde, bu kodun o prototipten devralınan tüm nesneler tarafından devralınacağı anlamına gelir. Bu, verilerin çalınmasına, rastgele kod çalıştırılmasına veya diğer uygulamaların kontrolünün ele geçirilmesine yol açar.



Aşağıdaki kod parçacığına prototip kirlilik kodu eklenecek:



sabit y = { A: 1 , B: 2 } ;
const verileri = JSON.parse ( '{'__proto__': { 'hatalı': doğru}}' ) ;

const c = Nesne.atama ( { } ve, veriler ) ;
konsol.log ( c. arızalı ) ;


Yukarıdaki kod parçacığının açıklaması:





    • İlk olarak “adlı liste” Ve ” oluşturulur ve değerleri anahtar/değer çiftinde saklar.
    • Yardımıyla ' -Öyleyse- ”, rastgele kirlenmiş kod, anahtar-değer biçiminde uygulanır. Anahtar şu şekilde ayarlanmıştır: hatalı ” ve “'in atanan değeri doğru ”.
    • Daha sonra bu kirli kod “ Ve ' listesini çağırarak ' atamak() ” yöntemini kullanır ve ortaya çıkan liste “ adlı yeni bir listede saklanır. C ”.
    • Son olarak “Enjekte edilen kirli kod” C ” listesi alınır ve değeri konsolda görüntülenir. Kirliliğin veya kötü amaçlı verilerin enjekte edildiğinden emin olmak için.

İçeren dosyayı çalıştırdıktan sonra çıktı, kötü amaçlı kodun başarıyla enjekte edildiğini ve değerinin alındığını gösterir:



Prototip Kirliliği Saldırıları Nasıl Önlenir?

Prototip kirlilik saldırısının önlenebileceği çeşitli yaklaşımlar vardır:

Güvenli Olmayan Özyinelemeli Birleştirmeler:

Güvenli olmayan özyinelemeli birleştirmelerden kaçının çünkü bunlar prototip kirlilik saldırılarına yol açabilir:

nerede birleştirme = ( almak , kaynak ) = > {
için ( var nitelikleri içinde kaynak ) {
eğer ( bir çeşit ( almak [ Öznitellikler ] ) === 'nesne' && bir çeşit ( kaynak [ Öznitellikler ] ) === 'nesne' )
{
birleştirmek ( almak [ Öznitellikler ] , kaynak [ Öznitellikler ] ) ;
} başka {
almak [ Öznitellikler ] = kaynak [ Öznitellikler ] ;
}
}
geri dönmek almak ;
} ;


Yukarıdaki kodda:

    • İlk olarak, özel işlev ' birleştirmek() ” iki dizi parametresini kabul eden oluşturulur” almak ' Ve ' kaynak ”.
    • Geliştirilmiş “ için 'döngüsü' değişkenini yinelemek için kullanılır Öznitellikler ' sağlananların üzerinde ' kaynak ' parametre.
    • Döngünün içinde bir “ eğer Her iki hatada da gezinen ve her iki dizide bulunan herhangi bir öğenin aynı veri türüne sahip olup olmadığını gösteren 'ifadesi. Daha sonra bu öğeler parametre olarak aynı ' birleştirmek() ” işlevi özyinelemeli bir doğa yaratıyor.
    • Tipler aynı değilse o zaman “” içinde bulunan eleman değeri kaynak ” parametre dizisi “'ye iletilir almak ' parametre.
    • Son olarak “ almak ”parametrik dizi döndürülür.

Prototipin Dondurulması

Prototip kirliliği saldırılarına yönelik bir başka önlem de yürütme döngülerinin dondurulmasıdır. Bu, “ Object.freeze() ' yöntem. Aşağıdaki kod parçasında, yukarıda enjekte edilen prototip kirli kod dondurulacak:

sabit y = { A: 1 , B: 2 } ;
const verileri = JSON.parse ( '{'__proto__': { 'hatalı': doğru}}' ) ;

const c = Nesne.atama ( { } ve, veriler ) ;
konsol.log ( c. arızalı ) ;

konsol.log ( Nesne.donma ( c. arızalı ) ) ;
konsol.log ( Object.isFrozen ( c. arızalı ) ) ;


Yukarıdaki kodun açıklaması aşağıda gösterilmiştir:

    • Başlangıçta, sahte listeye sahte prototipin kirli kodu eklenecek ' Ve ” tıpkı yukarıdaki bölümde açıklandığı gibi.
    • Daha sonra enjekte edilen kirli anahtar “ hatalı '' öğesine iletilir donmak() Kirlenmiş kısmı dondurma yöntemi.
    • Son olarak donmuş prototipin kirlilik kısmını doğrulamak için. “ hatalı “listenin anahtarı” C '' öğesine iletilir donmuş() ' yöntem. Bu yöntem şunu döndürür: doğru ” donma durumunda ve “ YANLIŞ ” dondurulmaması durumunda:

İçeren kodun çalıştırılmasından sonra çıktı, donmuş kirli kodun enjeksiyonunun, dondurulmasının ve doğrulanmasının şunu gösterir:


Prototip Kirliliği Saldırısını Önlemek İçin Ek İpuçları

Prototip kirlilik saldırısının önlenebileceği bazı ek ipuçları aşağıda belirtilmiştir:

    • “Seçenek” –devre dışı bırakma protokolü ',' öğesinin çalışmasını devre dışı bırakmak veya sonlandırmak için kullanılabilir prototip.__proto__ ' mülk.
    • “ yardımıyla yöntemleri kullanmayın. prototip ”.
    • İle ' Kullanıcı Girişini Temizleme Bu, kötü amaçlı veya kirli kodları kaldırmak için kullanıcı girişinin doğrulanmasını ve filtrelenmesini içerir.
    • Kullanımı ' beyaz liste ”, bir nesne için izin verilen özelliklerin ve yöntemlerin listesidir. Beyaz listenin üyesi olmayan özellikleri veya yöntemleri ayarlamaya veya almaya yönelik tüm girişimler engellenecektir.

Bunların hepsi Node.js'deki prototip kirliliği saldırılarının önlenmesiyle ilgili.

Çözüm

Prototip kirliliği saldırılarını önlemek için, güvenli olmayan özyinelemeli birleştirmelerden kaçınma, prototipin dondurulması ve 'beyaz listenin' kullanılması gibi yaklaşımlar ' __Öyleyse__ ” özelliğinin ayarlanmasından itibaren kullanılabilir. ' kullanımıyla birlikte –devre dışı bırakma protokolü ” seçenekleri, “ kullanımından kaçınılması Nesne.prototip ', Ve ' Kullanıcı Girişini temizleme ” kirli kod için. Bu kılavuz, Nodejs'te prototip kirliliği saldırılarının önlenmesini göstermektedir.