Как предотвратить атаки на прототипы загрязнения?

Kak Predotvratit Ataki Na Prototipy Zagraznenia



Атака «загрязнение прототипов» использует способ взаимодействия объектов JavaScript с соответствующими прототипами. В JavaScript прототипы — это еще один объект, который определяет свойства и методы по умолчанию для выбранного объекта. Злоумышленник использует загрязнение прототипов, внедряя в эти прототипы вредоносный код, манипулируя свойствами объекта или используя функцию, рекурсивно объединяющую объекты.

В этом руководстве объясняются способы предотвращения атак на прототипы, загрязняющих окружающую среду.







Предотвратить атаки на прототипы, загрязняющие окружающую среду?

Основная причина атак на загрязнение прототипов заключается в том, что объекты JavaScript наследуют свойства своего прототипа. Это означает, что если злоумышленник сможет внедрить вредоносный код в прототип, он будет унаследован всеми объектами, унаследованными от этого прототипа. Это приводит к краже данных, выполнению произвольного кода или получению контроля над другими приложениями.



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



константа у = { а: 1 , б: 2 } ;
константные данные = JSON.parse ( '{'__proto__': { 'неисправен': true}}' ) ;

const c = Object.assign ( { } и данные ) ;
консоль.log ( в.неисправен ) ;


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





    • Во-первых, список под названием « и создается и сохраняет значения в паре ключ-значение.
    • С помощью ' -поэтому- », случайный загрязненный код реализован в формате ключ-значение. Ключ установлен на « неисправный » и присвоенное значение « истинный ».
    • Затем этот загрязненный код присваивается « и ” список, вызвав “ назначать() », и полученный список сохраняется в новом списке с именем « с ».
    • Наконец, внедренный загрязненный код в файле « с ” список извлекается, и его значение отображается на консоли. Чтобы гарантировать, что были внедрены загрязняющие или вредоносные данные.

После выполнения содержащего файла выходные данные показывают, что вредоносный код был успешно внедрен и его значение получено:



Как предотвратить атаки на прототипы загрязнения?

Существует несколько подходов, с помощью которых можно предотвратить атаку загрязнения прототипа:

Небезопасные рекурсивные слияния:

Избегайте небезопасных рекурсивных слияний, поскольку они могут привести к атакам на загрязнение прототипа:

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


В приведенном выше коде:

    • Во-первых, пользовательская функция « слияние() », который принимает два параметра массива « берет ' и ' источник ».
    • Улучшенный « для Цикл «» используется для итерации переменной « атрибуты «сверх предоставленного» источник » параметр.
    • Внутри цикла используйте « если », который проходит через обе ошибки и имеет ли какой-либо элемент, находящийся в обоих массивах, один и тот же тип данных. Затем эти элементы передаются в качестве параметров тому же самому « слияние() » функция, создающая рекурсивный характер.
    • Если типы не совпадают, значение элемента, находящееся в « источник Массив параметров передается в метод « берет » параметр.
    • Наконец, « берет Возвращается параметрический массив.

Заморозка прототипа

Еще одним предотвращением атак на прототипы с загрязнением является заморозка цикла их выполнения. Это делается через « Объект.freeze() метод. В приведенном ниже фрагменте введенный выше прототип загрязненного кода будет заморожен:

константа у = { а: 1 , б: 2 } ;
константные данные = JSON.parse ( '{'__proto__': { 'неисправен': true}}' ) ;

const c = Object.assign ( { } и данные ) ;
консоль.log ( в.неисправен ) ;

консоль.log ( Объект.заморозка ( в.неисправен ) ) ;
консоль.log ( Object.isFrozen ( в.неисправен ) ) ;


Объяснение приведенного выше кода показано ниже:

    • Первоначально загрязненный код фиктивного прототипа будет добавлен в фиктивный список. и » так же, как объяснено в разделе выше.
    • Затем введенный загрязненный ключ « неисправный » передается в « заморозить() » метод замораживания загрязненной части.
    • Наконец, чтобы подтвердить часть загрязнения замороженного прототипа. « неисправный «ключ списка» с » передается в « замерз() метод. Этот метод возвращает « истинный ” в случае заморозки и “ ЛОЖЬ » в случае разморозки:

После выполнения содержащего кода выходные данные показывают, что внедрение, замораживание и проверка замороженного загрязненного кода:


Дополнительные советы по предотвращению атаки на прототип с загрязнением

Ниже приведены некоторые дополнительные советы, с помощью которых можно предотвратить атаку загрязнения прототипа:

    • Вариант « –отключить-прото » можно использовать для отключения или прекращения работы « прототип.__прото__ ' свойство.
    • Не используйте методы с помощью « опытный образец ».
    • К ' Очистка пользовательского ввода », который включает проверку и фильтрацию пользовательского ввода для удаления любого вредоносного или загрязненного кода.
    • Использование « белый список », который представляет собой список разрешенных свойств и методов объекта. Любые попытки установить или получить свойства или методы, не входящие в белый список, будут заблокированы.

Вот и все, что касается предотвращения атак загрязнения прототипов в Node.js.

Заключение

Чтобы предотвратить атаки на загрязнение прототипа, используются такие подходы, как предотвращение небезопасных рекурсивных слияний, замораживание прототипа и использование белого списка для предотвращения « __поэтому__ » можно использовать установленное свойство. Наряду с использованием « –отключить-прото », избегая использования « Объект.прототип ', и ' очистка пользовательского ввода » для загрязненного кода. В этом руководстве показано предотвращение атак типа «загрязнение» прототипов в Nodejs.