Что такое загрязнение прототипа в JavaScript?
При установке пакетов из npm в консоли периодически отображаются предупреждения о том, что тот или иной javascript пакет загрязняет прототип. Что это означает и чем это может быть опасно сейчас в данной статье я вам и расскажу.
Начнем с того, что, для примера, переопределим встроенный метод push объекта Array своим собственным методом, при этом в коде мы сохраним ссылку на оригинальны метод, чтобы в конце вызвать его. Сделаем, мы это для того чтобы у конечного пользователя не возникли ошибки. Код далее:
// сохраняем ссылку на оригинальный метод
var _push = Array.prototype.push;
// определяем свой собственный метод
Array.prototype.push = function( item ) {
// перед выполнением метода, выполняем некую операцию,
// например выведем в консоль некоторое значение
console.log( 'некоторое значение' );
// вызываем оригинальный метод
_push.apply( this, arguments );
// выполняем некоторую операцию после вызова оригинального метода.
if( this.length > 1000 ) {
console.warn( 'может быть здесь что-то не так' );
}
}
Вся суть примера выше, сводится к тому, что JavaScript очень гибкий язык, поэтому, вы можете в собственном коде переопределять любой встроенный метод или же добавлять к существующему типу свои методы. Это плюс. Но с другой стороны это и минус, так в любой сторонней библиотеке (NodeJS), может быть встроена дополнительная, отнюдь далеко не безвредная функциональность.
Например, представим что вы установили через пакетный менеджер npm какую-то библиотеку, которая Вам необходима для разработки приложения. Эта библиотека имеет зависимости от сторонних разработчиков, в одной из которых может происходить загрязнение прототипа функции того же объекта Array. Теперь при каждом вызове метода push, код в этом поддельном методе может собирать любую доступную информацию на Вашем ПК, например, в том числе пароли, коды доступа, в общем много чего.
В результате чего вся Ваша система, и не только ваша, если кодом будут пользоваться другие, становится уязвима к различного рода атакам.
Поэтому данная статья призвана обратить Ваше внимание на такие, далеко не простые, но тем не менее важные вещи, касающиеся безопасности при разработке на NodeJS.
-
- Михаил Русаков
Комментарии (0):
Для добавления комментариев надо войти в систему.
Если Вы ещё не зарегистрированы на сайте, то сначала зарегистрируйтесь.