Атака «загрязнение прототипов» использует способ взаимодействия объектов 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.