Vulnerability Focus - Prototype Pollution - Part 1
What is prototype pollution ?
In this Part , we are learning very basics
JavaScript is prototype-based i.e. JS is prototype-based language
Before understanding prototype pollution must know about prototype and Objects
Quick Recap about JS Objects =>
- JS Data Types => 8 => [String, Number, BigInt, Boolean,undefined, null, Symbol, Objects]
- Primitive Data Types => Except Object all 7 are Primitives and value is fixed in this type
- Object is -> Non Primitive Data Type
- In Object we can store multiple collections of data.
- In JS, we don’t need to create classes when creating objects
Now Learn about Prototype :
- We can create an object in JavaScript using an object constructor function.
// constructor function function Person () { this.name = 'Aakash', this.age = 30 } // creating objects const person1 = new Person(); const person2 = new Person();
function Person()is an object constructor function. person1andperson2 => 2 ObjectsIn JS => Every Function and Object => Has property named prototype by default.
Example =>
function Person () { this.name = 'Aakash', this.age = 30 } const person = new Person(); // checking the prototype value console.log(Person.prototype); // { ... } //Person.prototype => used to access the prototype of a Person constructor functionNow, If we are beginner and learner and don’t know what constructor is then =>
Constructor is a function which is used to create Objects
To create an object from a constructor function, we use the
newkeyword.So, new Person() => here we created constructor object
Also, in function we use this keyword => actually this refers to the object when the object is created.
In JS , we must know methods and properties
In JavaScript , poperties is value realted to Object
Generally properties can be change,add or delete and some can read only
In JS Objects => Named Value => are called properties
e.g. => Propert [name] have Value[Aakash]
We can add another property to object like => Person.love=”Maa”
Likewise, we can delete like => delete Person.age or delete Person[“age”]
Prototype is also property
JavaScript methods are actions that can be performed on objects
A JavaScript method is a property that contains a function definition.
Like, what we want from our object ?
Example =>
we create a button using javascript + html =>
- Button is object
- Button name => property
- Clicking on that Button => action => so clicking is method
More on Prototype
So, far we learned about Objects , properties and methods
Now learn about prototype
- In JavaScript, a prototype can be used to add properties and methods to a constructor function.
- And objects inherit properties and methods from a prototype
Example =>
// constructor function function Person () { this.name = 'Aakash', this.age = 30 } // creating objects const person1 = new Person(); const person2 = new Person(); // adding property to constructor function Person.prototype.gender = 'male'; // prototype value of Person console.log(Person.prototype); // inheriting the property from prototype console.log(person1.gender); console.log(person2.gender);we have added a new property
genderto thePersonconstructor function using: Person.prototype.gender = ‘male’;Then object
person1andperson2inherits the propertygenderfrom the prototype property ofPersonconstructor function.Hence, both objects
person1andperson2can access the gender property.So, Prototype is used to provide additional property to all the objects created from a constructor function.
Likewise we can also add methods to prototype like we added properties
// adding a method to the constructor function Person.prototype.greet = function() { console.log('hello' + ' ' + this.name); } person1.greet(); // hello Aakash person2.greet(); // hello Aakash
greet => this is method which we added to Person constructor function using a prototype.
and likewise => we can add many methods and properties using prototype
Point to Note:
If a prototype value is changed, then all the new objects will have the changed property value.
All the previously created objects will have the previous value
So, newly created prototype value => affected new Object but not Old Objects
Example =>
// constructor function function Person() { this.name = 'John' } // add a property Person.prototype.age = 20; // creating an object const person1 = new Person(); console.log(person1.age); // 20 // changing the property value of prototype Person.prototype = { age: 50 } // creating new object const person3 = new Person(); console.log(person3.age); // 50 console.log(person1.age); // 20
Good Practice for Developers
You should not modify the prototypes of standard JavaScript built-in objects like strings, arrays, etc. It is considered a bad practice.
We can access Prototype property like =>
// adding a prototype Person.prototype.age = 30; // accessing prototype property console.log(person.__proto__); // { age: 30 }
Prototype at a Glance or Summary =>
-
Prototypes are the mechanism by which JavaScript objects inherit features from one another.
-
Prototype Property allows you to add properties to any object
-
JavaScript objects inherit the property of their prototype.
-
The delete keyword does not remove inherited properties, but if you delete a prototype property, it will affect the object inherited from the prototype.
-
JS is prototype-based language . WHY ?
- to provide inheritance
-
objects can have a
prototypeobject, which acts as a template object that it inherits methods and properties from. -
An object’s prototype object may also have a prototype object, which it inherits methods and properties from, and so on.
- And this is called prototype chain
-
__proto__ property => Prototype -
Every object can have another object as its prototype Then the former object inherits all of its prototype’s properties.
An object specifies its prototype via the internal property
*[[Prototype]]*The chain of objects connected by the
*[[Prototype]]*property is called the prototype chain -
The
__proto__is an accessor property of theObject.prototypeobject.It exposes the internal prototype linkage (
[[Prototype]])) of an object through which it is accessed -
**[[Prototype]]**An object specifies its prototype via the internal property**__proto__**brings direct access to[[Prototype]]to the language**prototype**` is the ***object\*** that is used to build `__proto__` when you create an object with `new.**prototype**is not available on the instances themselves (or other objects), but only on the constructor functions.**prototype**is only available on functions since they are copied fromFunctionandObject,but in anything else it is not.However,
**__proto__**is available everywhere.
References
- https://www.programiz.com/javascript/prototype
- https://www.programiz.com/javascript/constructor-function
- https://hackernoon.com/understand-nodejs-javascript-object-inheritance-proto-prototype-class-9bd951700b29