Как да предотвратим атаки със замърсяване на прототип?

Kak Da Predotvratim Ataki S S Zam Rsavane Na Prototip



Атаката със замърсяване на прототип използва начина, по който обектите на JavaScript се справят със съответните им прототипи. В JavaScript прототипите са друг обект, който дефинира свойствата и методите по подразбиране за избрания обект. Нападателят използва замърсяването на прототипа, като инжектира злонамерен код в тези прототипи, като манипулира свойствата на обекта или използва функция, която рекурсивно обединява обекти.

Това ръководство обяснява начините за предотвратяване на атаки със замърсяване на прототип.







Предотвратяване на атаки със замърсяване на прототип?

Основната причина за атаките със замърсяване на прототип е, че JavaScript обектите наследяват свойства от своя прототип. Това означава, че ако атакуващият може да инжектира злонамерен код в прототипа, той ще бъде наследен от всички обекти, които са наследени от този прототип. Това води до кражба на данни, изпълнение на произволен код или поемане на контрол над други приложения.



В кодовия фрагмент по-долу ще бъде инжектиран прототипният код на замърсяване:



const y = { а: 1 , b: 2 } ;
const данни = JSON.parse ( '{'__proto__': { 'неправилно': вярно}}' ) ;

const c = Object.assign ( { } , и данни ) ;
console.log ( c.дефектен ) ;


Описанието на горния кодов фрагмент:





    • Първо, списъкът с име „ и ” се създава и съхранява стойностите в двойката ключ-стойност.
    • С помощта на ' -Следователно- ”, произволният замърсен код е имплементиран във формата ключ-стойност. Ключът е зададен на „ дефектен ” и присвоената стойност на „ вярно ”.
    • След това този замърсен код се присвоява на „ и ' чрез извикване на ' присвояване () ” и полученият списък се съхранява в нов списък с име „ ° С ”.
    • И накрая, инжектираният замърсен код в „ ° С ” списъкът се извлича и стойността му се показва на конзолата. За да се гарантира, че са били инжектирани замърсяване или злонамерени данни.

След изпълнение на съдържащия файл изходът показва, че зловредният код е инжектиран успешно и стойността му е извлечена:



Как да предотвратим атаки със замърсяване на прототип?

Има няколко подхода, чрез които прототипната атака на замърсяване може да бъде предотвратена:

Несигурни рекурсивни сливания:

Избягвайте несигурните рекурсивни сливания, защото те могат да доведат до прототипни атаки на замърсяване:

където сливане = ( взема , src ) = > {
за ( var атрибути в src ) {
ако ( тип ( взема [ атрибути ] ) === 'obj' && тип ( src [ атрибути ] ) === 'obj' )
{
сливане ( взема [ атрибути ] , src [ атрибути ] ) ;
} друго {
взема [ атрибути ] = src [ атрибути ] ;
}
}
връщане взема ;
} ;


В горния код:

    • Първо, персонализираната функция „ сливане () ” се създава, който приема два параметъра на масива „ взема ' и ' src ”.
    • Подобреният „ за 'цикълът се използва за повторение на променливата' атрибути ' над предоставеното ' src ” параметър.
    • Вътре в цикъла използвайте „ ако ”, който преминава през двете грешки и дали някой елемент, намиращ се в двата масива, има един и същи тип данни. След това тези елементи се предават като параметри на същия ' сливане () ” функция, създаваща рекурсивен характер.
    • Ако типовете не са еднакви, тогава стойността на елемента, намираща се в „ src ” масивът от параметри се предава на „ взема ” параметър.
    • И накрая, „ взема ” се връща параметричен масив.

Замразяване на прототипа

Друга превенция за атаки със замърсяване на прототипи е замразяването на техния цикъл на изпълнение. Това става чрез „ Object.freeze() ” метод. Във фрагмента по-долу горният инжектиран прототипен замърсен код ще бъде замразен:

const y = { а: 1 , b: 2 } ;
const данни = JSON.parse ( '{'__proto__': { 'неправилно': вярно}}' ) ;

const c = Object.assign ( { } , и данни ) ;
console.log ( c.дефектен ) ;

console.log ( Обект.замразяване ( c.дефектен ) ) ;
console.log ( Object.isFrozen ( c.дефектен ) ) ;


Обяснението на горния код е показано по-долу:

    • Първоначално замърсеният код на фиктивен прототип ще бъде инжектиран във фиктивния списък ' и ” точно както е обяснено в горния раздел.
    • След това инжектираният замърсен ключ “ дефектен ” се предава на „ замразяване () ” метод за замразяване на замърсената част.
    • И накрая, за да потвърдите частта за замърсяване на замразения прототип. „ дефектен „ключ от списъка“ ° С ” се предава на „ isFrozen() ” метод. Този метод връща „ вярно ” в случай на замразени и „ невярно ” в случай на незамразено:

След изпълнение на съдържащия код, изходът показва, че инжектирането, замразяването и проверката на замразен замърсен код:


Допълнителни съвети за предотвратяване на атака на прототип на замърсяване

По-долу са дадени някои допълнителни съвети, чрез които може да се предотврати атаката на замърсяване на прототипа:

    • Опцията за „ –disable-proto ” може да се използва за деактивиране или спиране на работата на „ прототип.__прото__ ' Имот.
    • Не използвайте методи с помощта на „ прототип ”.
    • от „ Саниране на въведеното от потребителя ”, което включва валидиране и филтриране на въведеното от потребителя, за да се премахне злонамерен или замърсен код.
    • Използване на ' бял списък ”, което е списък с разрешени свойства и методи за обект. Всички опити за задаване или получаване на свойства или методи, които не са член на белия списък, ще бъдат блокирани.

Това е всичко относно предотвратяването на атаки за замърсяване на прототипи в Node.js.

Заключение

За предотвратяване на атаки със замърсяване на прототип подходи като избягване на несигурни рекурсивни сливания, замразяване на прототипа и използване на бял списък за предотвратяване на „ __Следователно__ ” може да се използва свойството да бъде зададено. Наред с използването на „ –disable-proto ” опции, като се избягва използването на „ Обект.прототип ', и ' дезинфекция на въведеното от потребителя ” за замърсен код. Това ръководство илюстрира предотвратяването на прототипни атаки на замърсяване в Nodejs.