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. person1and
person2 => 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 function
Now, 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
new
keyword.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
gender
to thePerson
constructor function using: Person.prototype.gender = ‘male’;Then object
person1
andperson2
inherits the propertygender
from the prototype property ofPerson
constructor function.Hence, both objects
person1
andperson2
can 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
prototype
object, 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.prototype
object.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 fromFunction
andObject,
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