Bagaimana untuk Mencegah Serangan Pencemaran Prototaip?

Bagaimana Untuk Mencegah Serangan Pencemaran Prototaip



Serangan pencemaran prototaip mengeksploitasi cara objek JavaScript menangani prototaip yang sepadan. Dalam JavaScript, Prototaip ialah objek lain yang mentakrifkan sifat lalai dan kaedah untuk objek yang dipilih. Penyerang mengeksploitasi pencemaran prototaip dengan menyuntik kod hasad ke dalam prototaip ini dengan memanipulasi sifat objek atau dengan menggunakan fungsi yang menggabungkan objek secara rekursif.

Panduan ini menerangkan cara untuk mencegah serangan pencemaran prototaip.







Cegah Serangan Pencemaran Prototaip?

Punca serangan pencemaran prototaip ialah objek JavaScript mewarisi sifat daripada prototaipnya. Ini bermakna jika penyerang boleh menyuntik kod hasad ke dalam prototaip, ia akan diwarisi oleh semua objek yang diwarisi daripada prototaip tersebut. Ini membawa kepada pencurian data, melaksanakan kod sewenang-wenangnya, atau mengawal aplikasi lain.



Dalam coretan kod di bawah, kod pencemaran prototaip akan disuntik:



const y = { a: 1 , b: 2 } ;
data const = JSON.parse ( '{'__proto__': { 'faulty': true}}' ) ;

const c = Object.assign ( { } , dan, data ) ;
konsol.log ( c. rosak ) ;


Perihalan coretan kod di atas:





    • Pertama, senarai bernama ' dan ” dicipta dan ia menyimpan nilai dalam pasangan nilai kunci.
    • Dengan bantuan ' -Oleh itu- ”, kod tercemar rawak dilaksanakan dalam format nilai kunci. Kunci ditetapkan kepada ' rosak ” dan nilai yang diperuntukkan bagi “ benar ”.
    • Kemudian, kod tercemar ini diberikan kepada ' dan senarai ” dengan menggunakan “ berikan () ” kaedah, dan senarai yang terhasil disimpan dalam senarai baharu bernama “ c ”.
    • Akhirnya, kod tercemar yang disuntik dalam ' c ” senarai diambil dan nilainya dipaparkan di atas konsol. Untuk memastikan bahawa pencemaran atau data berniat jahat telah disuntik.

Selepas melaksanakan fail yang mengandungi, output menunjukkan bahawa kod hasad telah berjaya disuntik dan nilainya telah diambil semula:



Bagaimana untuk Mencegah Serangan Pencemaran Prototaip?

Terdapat beberapa pendekatan di mana serangan pencemaran prototaip boleh dicegah:

Gabungan Rekursif Tidak Selamat:

Elakkan gabungan rekursif yang tidak selamat kerana ia boleh membawa kepada serangan pencemaran prototaip:

di mana bergabung = ( mengambil , src ) = > {
untuk ( atribut var dalam src ) {
jika ( jenis ( mengambil [ sifat-sifat ] ) === 'obj' && jenis ( src [ sifat-sifat ] ) === 'obj' )
{
bercantum ( mengambil [ sifat-sifat ] , src [ sifat-sifat ] ) ;
} lain {
mengambil [ sifat-sifat ] = src [ sifat-sifat ] ;
}
}
kembali mengambil ;
} ;


Dalam kod di atas:

    • Pertama, fungsi tersuai ' merge() ' dicipta yang menerima dua parameter tatasusunan ' mengambil ” dan “ src ”.
    • yang dipertingkatkan ' untuk 'gelung digunakan untuk mengulang pembolehubah' sifat-sifat ' atas yang disediakan ' src ” parameter.
    • Di dalam gelung, gunakan ' jika ” pernyataan yang menavigasi melalui kedua-dua ralat dan jika mana-mana elemen yang berada dalam kedua-dua tatasusunan mempunyai jenis data yang sama. Kemudian unsur-unsur tersebut diluluskan sebagai parameter kepada ' yang sama merge() ” fungsi mewujudkan sifat rekursif.
    • Jika jenisnya tidak sama maka, nilai elemen yang berada dalam ' src ' tatasusunan parameter dihantar ke ' mengambil ” parameter.
    • Akhirnya, ' mengambil ” tatasusunan parametrik akan dikembalikan.

Membekukan Prototaip

Satu lagi pencegahan untuk serangan pencemaran prototaip adalah dengan membekukan kitaran pelaksanaannya. Ini dilakukan melalui ' Object.freeze() ” kaedah. Dalam coretan di bawah, kod tercemar prototaip yang disuntik di atas akan dibekukan:

const y = { a: 1 , b: 2 } ;
data const = JSON.parse ( '{'__proto__': { 'faulty': true}}' ) ;

const c = Object.assign ( { } , dan, data ) ;
konsol.log ( c. rosak ) ;

konsol.log ( Object.freeze ( c. rosak ) ) ;
konsol.log ( Object.isFrozen ( c. rosak ) ) ;


Penjelasan kod di atas ditunjukkan di bawah:

    • Pada mulanya, kod tercemar prototaip tiruan akan disuntik ke dalam senarai tiruan “ dan ” sama seperti yang dijelaskan dalam bahagian di atas.
    • Kemudian, kunci tercemar yang disuntik ' rosak ” diserahkan kepada “ beku() ” kaedah untuk membekukan bahagian yang tercemar.
    • Akhir sekali, untuk mengesahkan bahagian pencemaran prototaip beku. ' rosak 'kunci senarai' c ” diserahkan kepada “ beku() ” kaedah. Kaedah ini mengembalikan ' benar ” sekiranya dibekukan dan “ salah ” sekiranya tidak dibekukan:

Selepas melaksanakan kod yang mengandungi, output menunjukkan bahawa suntikan, pembekuan dan pengesahan kod tercemar beku:


Petua Tambahan untuk Mencegah Serangan Pencemaran Prototaip

Beberapa petua tambahan yang menggunakan prototaip serangan pencemaran boleh dicegah dinyatakan di bawah:

    • Pilihan ' –disable-proto ' boleh digunakan untuk melumpuhkan atau mematikan kerja ' prototaip.__proto__ ” harta benda.
    • Jangan gunakan kaedah dengan bantuan “ prototaip ”.
    • Oleh ' Membersihkan Input Pengguna ” yang melibatkan pengesahan dan penapisan input pengguna untuk mengalih keluar sebarang kod berniat jahat atau tercemar.
    • Penggunaan ' senarai putih ”, yang merupakan senarai sifat dan kaedah yang dibenarkan untuk objek. Sebarang percubaan untuk menetapkan atau mendapatkan sifat atau kaedah yang bukan ahli senarai putih akan disekat.

Itu sahaja tentang pencegahan serangan pencemaran prototaip dalam Node.js.

Kesimpulan

Untuk mengelakkan serangan pencemaran Prototaip, pendekatan seperti mengelakkan gabungan rekursif yang tidak selamat, membekukan prototaip dan penggunaan senarai putih untuk mengelakkan ' __Oleh itu__ ” harta daripada ditetapkan boleh digunakan. Seiring dengan penggunaan ' –disable-proto ' pilihan, mengelakkan penggunaan ' Objek.prototaip ”, dan “ membersihkan Input Pengguna ” untuk kod tercemar. Panduan ini telah menggambarkan pencegahan serangan pencemaran prototaip dalam Nodejs.