ΠΠ·ΡΠ»Π΅Π΄ΠΎΠ²Π°ΡΠ΅Π»ΠΈ ΠΎΡ Π¦Π΅Π½ΡΡΡΠ° Π·Π° ΠΈΠ½ΡΠΎΡΠΌΠ°ΡΠΈΠΎΠ½Π½Π° ΡΠΈΠ³ΡΡΠ½ΠΎΡΡ Π½Π° ΠΠ΅Π»ΠΌΡ ΠΎΠ»Ρ (CISPA) ΠΈ Π¨Π²Π΅Π΄ΡΠΊΠΈΡ ΡΠ΅Ρ Π½ΠΎΠ»ΠΎΠ³ΠΈΡΠ΅Π½ ΠΈΠ½ΡΡΠΈΡΡΡ Π°Π½Π°Π»ΠΈΠ·ΠΈΡΠ°Ρ Π° ΠΏΡΠΈΠ»ΠΎΠΆΠΈΠΌΠΎΡΡΡΠ° Π½Π° ΡΠ΅Ρ Π½ΠΈΠΊΠ°ΡΠ° Π·Π° Π·Π°ΠΌΡΡΡΡΠ²Π°Π½Π΅ Π½Π° ΠΏΡΠΎΡΠΎΡΠΈΠΏΠΈ Π½Π° JavaScript (βprototype pollutionβ) Π·Π° ΠΎΡΡΡΠ΅ΡΡΠ²ΡΠ²Π°Π½Π΅ Π½Π° Π°ΡΠ°ΠΊΠΈ ΡΡΠ΅ΡΡ ΠΏΠ»Π°ΡΡΠΎΡΠΌΠ°ΡΠ° Node.js ΠΈ ΠΏΠΎΠΏΡΠ»ΡΡΠ½ΠΈ ΠΏΡΠΈΠ»ΠΎΠΆΠ΅Π½ΠΈΡ, ΠΈΠ·Π³ΡΠ°Π΄Π΅Π½ΠΈ Π½Π° Π½Π΅ΠΉΠ½Π°ΡΠ° ΠΎΡΠ½ΠΎΠ²Π°, ΠΊΠΎΠ΅ΡΠΎ Π²ΠΎΠ΄ΠΈ Π΄ΠΎ ΠΈΠ·ΠΏΡΠ»Π½Π΅Π½ΠΈΠ΅ Π½Π° ΠΊΠΎΠ΄.
ΠΠ΅ΡΠΎΠ΄ΡΡ Π·Π° Π·Π°ΠΌΡΡΡΡΠ²Π°Π½Π΅ Π½Π° ΠΏΡΠΎΡΠΎΡΠΈΠΏΠ° ΠΈΠ·ΠΏΠΎΠ»Π·Π²Π° ΠΎΡΠΎΠ±Π΅Π½ΠΎΡΡ Π½Π° Π΅Π·ΠΈΠΊΠ° JavaScript, ΠΊΠΎΡΡΠΎ ΠΏΠΎΠ·Π²ΠΎΠ»ΡΠ²Π° Π΄ΠΎΠ±Π°Π²ΡΠ½Π΅ΡΠΎ Π½Π° Π½ΠΎΠ²ΠΈ ΡΠ²ΠΎΠΉΡΡΠ²Π° Π² ΠΊΠΎΡΠ΅Π½Π½ΠΈΡ ΠΏΡΠΎΡΠΎΡΠΈΠΏ Π½Π° Π²ΡΡΠΊΠ°ΠΊΡΠ² ΠΎΠ±Π΅ΠΊΡ. Π ΠΏΡΠΈΠ»ΠΎΠΆΠ΅Π½ΠΈΡ ΠΌΠΎΠ³Π°Ρ Π΄Π° ΡΠ΅ ΡΡΠ΅ΡΠ°Ρ Π±Π»ΠΎΠΊΠΎΠ²Π΅ ΠΊΠΎΠ΄ (Π³Π°Π΄ΠΆΠ΅ΡΠΈ), Π½Π° ΠΊΠΎΠΈΡΠΎ ΡΠ°Π±ΠΎΡΠ°ΡΠ° ΠΈΠΌ Π²Π»ΠΈΡΠ΅ Π΄ΠΎΠ±Π°Π²Π΅Π½ΠΎΡΠΎ ΡΠ²ΠΎΠΉΡΡΠ²ΠΎ, Π½Π°ΠΏΡΠΈΠΌΠ΅Ρ, Π² ΠΊΠΎΠ΄Π° ΠΌΠΎΠΆΠ΅ Π΄Π° ΠΈΠΌΠ° ΠΊΠΎΠ½ΡΡΡΡΠΊΡΠΈΡ ΠΎΡ Π²ΠΈΠ΄Π° 'const cmd = options.cmd || "/bin/sh"', Π»ΠΎΠ³ΠΈΠΊΠ°ΡΠ° Π½Π° ΠΊΠΎΡΡΠΎ ΡΠ΅ Π±ΡΠ΄Π΅ ΠΏΡΠΎΠΌΠ΅Π½Π΅Π½Π°, Π°ΠΊΠΎ Π½Π°ΠΏΠ°Π΄Π°ΡΠ΅Π»ΡΡ ΡΡΠΏΠ΅Π΅ Π΄Π° Π²Π½Π΅Π΄ΡΠΈ ΡΠ²ΠΎΠΉΡΡΠ²ΠΎΡΠΎ 'cmd' Π² ΠΊΠΎΡΠ΅Π½Π½ΠΈΡ ΠΏΡΠΎΡΠΎΡΠΈΠΏ.
ΠΠ° ΡΡΠΏΠ΅ΡΠ½ΠΎΡΠΎ ΠΎΡΡΡΠ΅ΡΡΠ²ΡΠ²Π°Π½Π΅ Π½Π° Π°ΡΠ°ΠΊΠ° Π΅ Π½Π΅ΠΎΠ±Ρ ΠΎΠ΄ΠΈΠΌΠΎ Π² ΠΏΡΠΈΠ»ΠΎΠΆΠ΅Π½ΠΈΠ΅ΡΠΎ ΠΏΠΎΡΡΡΠΏΠ²Π°ΡΠΈΡΠ΅ ΠΎΡ Π²ΡΠ½ΡΠ½ΠΈ ΠΈΠ·ΡΠΎΡΠ½ΠΈΡΠΈ Π΄Π°Π½Π½ΠΈ Π΄Π° ΠΌΠΎΠ³Π°Ρ Π΄Π° ΡΠ΅ ΠΈΠ·ΠΏΠΎΠ»Π·Π²Π°Ρ Π·Π° ΡΡΠ·Π΄Π°Π²Π°Π½Π΅ Π½Π° Π½ΠΎΠ²ΠΎ ΡΠ²ΠΎΠΉΡΡΠ²ΠΎ Π² ΠΊΠΎΡΠ΅Π½Π½ΠΈΡ ΠΏΡΠΎΡΠΎΡΠΈΠΏ Π½Π° ΠΎΠ±Π΅ΠΊΡΠ°, ΠΊΠ°ΠΊΡΠΎ ΠΈ ΠΏΠΎ Π²ΡΠ΅ΠΌΠ΅ Π½Π° ΠΈΠ·ΠΏΡΠ»Π½Π΅Π½ΠΈΠ΅ Π΄Π° ΡΠ΅ ΡΡΠ΅ΡΠ° Π³Π°Π΄ΠΆΠ΅Ρ, Π·Π°Π²ΠΈΡΠ΅Ρ ΠΎΡ ΠΏΡΠΎΠΌΠ΅Π½Π΅Π½ΠΎΡΠΎ ΡΠ²ΠΎΠΉΡΡΠ²ΠΎ. ΠΡΠΎΠΌΡΠ½Π°ΡΠ° Π½Π° ΠΏΡΠΎΡΠΎΡΠΈΠΏΠ° ΡΠ΅ ΠΎΡΡΡΠ΅ΡΡΠ²ΡΠ²Π° ΡΡΠ΅Π· ΠΎΠ±ΡΠ°Π±ΠΎΡΠΊΠ° Π² Node.js Π½Π° ΡΠ»ΡΠΆΠ΅Π±Π½ΠΈΡΠ΅ ΡΠ²ΠΎΠΉΡΡΠ²Π° '.__proto__' ΠΈ '.constructor'. Π‘Π²ΠΎΠΉΡΡΠ²ΠΎΡΠΎ '.__proto__' Π²ΡΡΡΠ° ΠΏΡΠΎΡΠΎΡΠΈΠΏΠ° Π½Π° ΠΊΠ»Π°ΡΠ° Π½Π° ΠΎΠ±Π΅ΠΊΡΠ°, Π΄ΠΎΠΊΠ°ΡΠΎ ΡΠ²ΠΎΠΉΡΡΠ²ΠΎΡΠΎ '.constructor' Π²ΡΡΡΠ° ΡΡΠ½ΠΊΡΠΈΡΡΠ°, ΠΈΠ·ΠΏΠΎΠ»Π·Π²Π°Π½Π° Π·Π° ΡΡΠ·Π΄Π°Π²Π°Π½Π΅ΡΠΎ Π½Π° ΠΎΠ±Π΅ΠΊΡΠ°.
ΠΠΊΠΎ Π² ΠΊΠΎΠ΄Π° Π½Π° ΠΏΡΠΈΠ»ΠΎΠΆΠ΅Π½ΠΈΠ΅ΡΠΎ ΡΠ΅ ΡΡΠ΅ΡΠ° ΠΏΡΠΈΡΠ²ΠΎΡΠ²Π°Π½Π΅ 'obj[a][b] = value' ΠΈ ΡΡΠΎΠΉΠ½ΠΎΡΡΠΈΡΠ΅ ΡΠ΅ ΠΈΠ·Π²Π΅ΠΆΠ΄Π°Ρ ΠΎΡ Π²ΡΠ½ΡΠ½ΠΈ Π΄Π°Π½Π½ΠΈ, Π½Π°ΠΏΠ°Π΄Π°ΡΠ΅Π»ΡΡ ΠΌΠΎΠΆΠ΅ Π΄Π° Π·Π°Π΄Π°Π΄Π΅ 'a' Π½Π° ΡΡΠΎΠΉΠ½ΠΎΡΡ '.__proto__' ΠΈ Π΄Π° ΠΎΡΠΈΠ³ΡΡΠΈ ΡΡΠ·Π΄Π°Π²Π°Π½Π΅ΡΠΎ Π½Π° ΡΠ²ΠΎΠ΅ ΡΠΎΠ±ΡΡΠ²Π΅Π½ΠΎ ΡΠ²ΠΎΠΉΡΡΠ²ΠΎ Ρ ΠΈΠΌΠ΅ 'b' ΠΈ ΡΡΠΎΠΉΠ½ΠΎΡΡ 'value' Π² ΠΊΠΎΡΠ΅Π½Π½ΠΈΡ ΠΏΡΠΎΡΠΎΡΠΈΠΏ Π½Π° ΠΎΠ±Π΅ΠΊΡΠ° (obj.__proto__.b = value;), ΠΈ Π·Π°Π΄Π°Π΄Π΅Π½ΠΎΡΠΎ Π² ΠΏΡΠΎΡΠΎΡΠΈΠΏΠ° ΡΠ²ΠΎΠΉΡΡΠ²ΠΎ ΡΠ΅ Π±ΡΠ΄Π΅ Π²ΠΈΠ΄ΠΈΠΌΠΎ Π²ΡΠ² Π²ΡΠΈΡΠΊΠΈ ΠΎΠ±Π΅ΠΊΡΠΈ. ΠΠΎΠ΄ΠΎΠ±Π½ΠΎ, Π°ΠΊΠΎ Π² ΠΊΠΎΠ΄Π° ΡΠ΅ ΡΡΠ΅ΡΠ°Ρ ΠΈΠ·ΡΠ°Π·ΠΈ ΠΎΡ Π²ΠΈΠ΄Π° 'obj[a][b][c] = value', Π·Π°Π΄Π°Π²Π°ΠΉΠΊΠΈ 'a' Π½Π° ΡΡΠΎΠΉΠ½ΠΎΡΡ '.constructor' ΠΈ 'b' Π½Π° 'prototype', ΠΌΠΎΠΆΠ΅ Π΄Π° ΡΠ΅ ΠΎΠΏΡΠ΅Π΄Π΅Π»ΠΈ Π½ΠΎΠ²ΠΎ ΡΠ²ΠΎΠΉΡΡΠ²ΠΎ Ρ ΠΈΠΌΠ΅ 'c' ΠΈ ΡΡΠΎΠΉΠ½ΠΎΡΡ 'value'.
ΠΡΠΈΠΌΠ΅Ρ Π·Π° ΠΏΡΠΎΠΌΡΠ½Π° Π½Π° ΠΏΡΠΎΡΠΎΡΠΈΠΏΠ°: const o1 = {}; const o2 = new Object(); o1.__proto__.x = 42; // ΡΡΠ·Π΄Π°Π²Π°ΠΌΠ΅ Π² ΠΊΠΎΡΠ΅Π½Π½ΠΈΡ ΠΏΡΠΎΡΠΎΡΠΈΠΏ ΡΠ²ΠΎΠΉΡΡΠ²ΠΎ 'x' console.log(o2.x); // ΠΏΠΎΠ»ΡΡΠ°Π²Π°ΠΌΠ΅ Π΄ΠΎΡΡΡΠΏ Π΄ΠΎ ΡΠ²ΠΎΠΉΡΡΠ²ΠΎΡΠΎ 'x' ΠΎΡ Π΄ΡΡΠ³ ΠΎΠ±Π΅ΠΊΡ // Π½Π° ΠΈΠ·Ρ ΠΎΠ΄Π° ΡΠ΅ ΠΏΠΎΠ»ΡΡΠΈΠΌ 42, ΡΡΠΉ ΠΊΠ°ΡΠΎ ΠΊΠΎΡΠ΅Π½Π½ΠΈΡΡ ΠΏΡΠΎΡΠΎΡΠΈΠΏ, ΠΈΠ·ΠΏΠΎΠ»Π·Π²Π°Π½ Π² ΠΎΠ±Π΅ΠΊΡΠ° o2, Π΅ ΠΏΡΠΎΠΌΠ΅Π½Π΅Π½ ΡΡΠ΅Π· ΠΎΠ±Π΅ΠΊΡ o1.
ΠΡΠΈΠΌΠ΅Ρ Π·Π° ΡΡΠ·Π²ΠΈΠΌ ΠΊΠΎΠ΄: function entryPoint(arg1, arg2, arg3) { const obj = {}; const p = obj[arg1]; p[arg2] = arg3; return p; }
ΠΠΊΠΎ Π°ΡΠ³ΡΠΌΠ΅Π½ΡΠΈΡΠ΅ Π½Π° ΡΡΠ½ΠΊΡΠΈΡΡΠ° entryPoint ΡΠ΅ ΡΠΎΡΠΌΠΈΡΠ°Ρ ΠΎΡ Π²Ρ ΠΎΠ΄ΡΡΠΈ Π΄Π°Π½Π½ΠΈ, Π°ΡΠ°ΠΊΡΠ²Π°ΡΠΈΡΡ ΠΌΠΎΠΆΠ΅ Π΄Π° ΠΏΡΠ΅Π΄Π°Π΄Π΅ Π² arg1 ΡΡΠΎΠΉΠ½ΠΎΡΡΡΠ° Β«__proto__Β» ΠΈ Π΄Π° ΡΡΠ·Π΄Π°Π΄Π΅ Π² ΠΊΠΎΡΠ΅Π½ΠΎΠ²ΠΈΡ ΠΏΡΠΎΡΠΎΡΠΈΠΏ ΡΠ²ΠΎΠΉΡΡΠ²ΠΎ Ρ ΠΏΡΠΎΠΈΠ·Π²ΠΎΠ»Π½ΠΎ ΠΈΠΌΠ΅. ΠΠΊΠΎ Π² arg2 ΡΠ΅ ΠΏΡΠ΅Π΄Π°Π΄Π΅ ΡΡΠΎΠΉΠ½ΠΎΡΡ Β«toStringΒ», Π° Π² arg3 β 1, ΠΌΠΎΠΆΠ΅ Π΄Π° ΡΠ΅ ΠΎΠΏΡΠ΅Π΄Π΅Π»ΠΈ ΡΠ²ΠΎΠΉΡΡΠ²ΠΎΡΠΎ Β«toStringΒ» (Object.prototype.toString=1) ΠΈ Π΄Π° ΡΠ΅ ΠΏΡΠ΅Π΄ΠΈΠ·Π²ΠΈΠΊΠ° ΡΡΠΈΠ² Π½Π° ΠΏΡΠΈΠ»ΠΎΠΆΠ΅Π½ΠΈΠ΅ΡΠΎ ΠΏΠΎ Π²ΡΠ΅ΠΌΠ΅ Π½Π° ΠΈΠ·Π²ΠΈΠΊΠ²Π°Π½Π΅ΡΠΎ Π½Π° ΡΡΠ½ΠΊΡΠΈΡΡΠ° toString().
ΠΠ°ΡΠΎ ΠΏΡΠΈΠΌΠ΅Ρ Π·Π° ΡΠΈΡΡΠ°ΡΠΈΠΈ, ΠΊΠΎΠΈΡΠΎ ΠΌΠΎΠ³Π°Ρ Π΄Π° Π΄ΠΎΠ²Π΅Π΄Π°Ρ Π΄ΠΎ ΠΈΠ·ΠΏΡΠ»Π½Π΅Π½ΠΈΠ΅ Π½Π° ΠΊΠΎΠ΄ ΠΎΡ Π°ΡΠ°ΠΊΡΠ²Π°ΡΠΈΡ, ΡΠ΅ Π΄Π°Π²Π° ΡΡΠ·Π΄Π°Π²Π°Π½Π΅ Π½Π° ΡΠ²ΠΎΠΉΡΡΠ²Π° Β«mainΒ», Β«shellΒ», Β«exportsΒ», Β«contextExtensionsΒ» ΠΈ Β«envΒ». ΠΠ°ΠΏΡΠΈΠΌΠ΅Ρ, Π°ΡΠ°ΠΊΡΠ²Π°ΡΠΈΡΡ ΠΌΠΎΠΆΠ΅ Π΄Π° ΡΡΠ·Π΄Π°Π΄Π΅ Π² ΠΊΠΎΡΠ΅Π½ΠΎΠ²ΠΈΡ ΠΏΡΠΎΡΠΎΡΠΈΠΏ Π½Π° ΠΎΠ±Π΅ΠΊΡΠ° ΡΠ²ΠΎΠΉΡΡΠ²ΠΎΡΠΎ Β«mainΒ», Π·Π°ΠΏΠΈΡΠ²Π°ΠΉΠΊΠΈ Π² Π½Π΅Π³ΠΎ ΠΏΡΡΡ Π΄ΠΎ ΡΠ²ΠΎΡ ΡΠΊΡΠΈΠΏΡ (Object.prototype.main = Β«.\/..\/..\/pwned.jsΒ») ΠΈ ΡΠΎΠ²Π° ΡΠ²ΠΎΠΉΡΡΠ²ΠΎ ΡΠ΅ Π±ΡΠ΄Π΅ ΠΈΠ·Π²ΠΈΠΊΠ°Π½ΠΎ Π² ΠΌΠΎΠΌΠ΅Π½ΡΠ° Π½Π° ΠΈΠ·ΠΏΡΠ»Π½Π΅Π½ΠΈΠ΅ΡΠΎ Π½Π° ΠΊΠΎΠ΄Π° Ρ ΠΊΠΎΠ½ΡΡΡΡΠΊΡΠΈΡΡΠ° require(Β«my-packageΒ»), Π°ΠΊΠΎ ΡΠ²ΡΡΠ·Π°Π½ΠΈΡΡ ΠΏΠ°ΠΊΠ΅Ρ Π½Π΅ ΠΎΠΏΡΠ΅Π΄Π΅Π»Ρ ΡΠ²Π½ΠΎ Π² package.json ΡΠ²ΠΎΠΉΡΡΠ²ΠΎΡΠΎ Β«mainΒ» (Π°ΠΊΠΎ ΡΠ²ΠΎΠΉΡΡΠ²ΠΎΡΠΎ Π½Π΅ Π΅ ΠΎΠΏΡΠ΅Π΄Π΅Π»Π΅Π½ΠΎ, ΡΠΎ ΡΠ΅ Π±ΡΠ΄Π΅ ΠΏΠΎΠ»ΡΡΠ΅Π½ΠΎ ΠΎΡ ΠΊΠΎΡΠ΅Π½ΠΎΠ²ΠΈΡ ΠΏΡΠΎΡΠΎΡΠΈΠΏ). ΠΠ½Π°Π»ΠΎΠ³ΠΈΡΠ½ΠΎ ΠΌΠΎΠ³Π°Ρ Π΄Π° Π±ΡΠ΄Π°Ρ ΠΏΠΎΠ΄ΠΌΠ΅Π½Π΅Π½ΠΈ ΡΠ²ΠΎΠΉΡΡΠ²Π°ΡΠ° Β«shellΒ», Β«exportsΒ» ΠΈ Β«envΒ»: let rootProto = Object.prototype; rootProto[Β«exportsΒ»] = {Β«.Β»:Β«.\/changelog.jsΒ»}; rootProto[Β«1Β»] = Β«\/path\/to\/npm\/scripts\/Β»; \/\/ ΡΡΠΈΠ³Π΅Ρ Π·Π° ΠΈΠ·Π²ΠΈΠΊΠ²Π°Π½Π΅ require (Β«.\/target.jsΒ»); Object.prototype.main = Β«\/path\/to\/npm\/scripts\/changelog.jsΒ»; Object.prototype.shell = Β«nodeΒ»; Object.prototype.env = {}; Object.prototype.env.NODE_OPTIONS = Β«βinspect-brk=0.0.0.0:1337Β»; \/\/ ΡΡΠΈΠ³Π΅Ρ Π·Π° ΠΈΠ·Π²ΠΈΠΊΠ²Π°Π½Π΅ require (Β«bytesΒ»);
ΠΠ·ΡΠ»Π΅Π΄ΠΎΠ²Π°ΡΠ΅Π»ΠΈΡΠ΅ Π°Π½Π°Π»ΠΈΠ·ΠΈΡΠ°Ρ Π° 10 000 NPM ΠΏΠ°ΠΊΠ΅ΡΠ° Ρ Π½Π°ΠΉ-ΠΌΠ½ΠΎΠ³ΠΎ Π·Π°Π²ΠΈΡΠΈΠΌΠΎΡΡΠΈ ΠΈ ΡΡΡΠ°Π½ΠΎΠ²ΠΈΡ Π°, ΡΠ΅ 1958 ΠΎΡ ΡΡΡ Π½ΡΠΌΠ°Ρ ΡΠ²ΠΎΠΉΡΡΠ²ΠΎ main Π² package.json, 4420 ΠΈΠ·ΠΏΠΎΠ»Π·Π²Π°Ρ ΠΎΡΠ½ΠΎΡΠΈΡΠ΅Π»Π½ΠΈ ΠΏΡΡΠΈΡΠ° Π² ΠΈΠ·ΡΠ°Π·Π° require, Π° 355 Π΄ΠΈΡΠ΅ΠΊΡΠ½ΠΎ ΠΈΠ·ΠΏΠΎΠ»Π·Π²Π°Ρ API Π·Π° ΠΏΠΎΠ΄ΠΌΡΠ½Π° Π½Π° ΠΊΠΎΠΌΠ°Π½Π΄ΠΈ.
ΠΠ°ΡΠΎ ΡΠ°Π±ΠΎΡΠ΅Ρ ΠΏΡΠΈΠΌΠ΅Ρ ΠΌΠΎΠΆΠ΅ Π΄Π° ΡΠ΅ Π΄Π°Π΄Π΅ Π΅ΠΊΡΠΏΠ»ΠΎΠΉΡ Π·Π° Π°ΡΠ°ΠΊΠ° Π½Π° Π±Π΅ΠΊΠ΅Π½Π΄Π° Π½Π° Parse Server, ΠΊΠΎΠΉΡΠΎ ΠΏΡΠ΅ΠΎΠΏΡΠ΅Π΄Π΅Π»Ρ ΡΠ²ΠΎΠΉΡΡΠ²ΠΎΡΠΎ evalFunctions. ΠΠ° ΡΠ»Π΅ΡΠ½ΡΠ²Π°Π½Π΅ Π½Π° ΠΈΠ΄Π΅Π½ΡΠΈΡΠΈΡΠΈΡΠ°Π½Π΅ Π½Π° ΠΏΠΎΠ΄ΠΎΠ±Π½ΠΈ ΡΡΠ·Π²ΠΈΠΌΠΎΡΡΠΈ Π΅ ΡΠ°Π·ΡΠ°Π±ΠΎΡΠ΅Π½ ΠΈΠ½ΡΡΡΡΠΌΠ΅Π½ΡΠ°ΡΠΈΡΠΌ, ΠΊΠΎΠΌΠ±ΠΈΠ½ΠΈΡΠ°Ρ ΠΌΠ΅ΡΠΎΠ΄ΠΈ Π½Π° ΡΡΠ°ΡΠΈΡΠ΅Π½ ΠΈ Π΄ΠΈΠ½Π°ΠΌΠΈΡΠ΅Π½ Π°Π½Π°Π»ΠΈΠ·. ΠΡΠΈ ΡΠ΅ΡΡΠ²Π°Π½Π΅ Π½Π° Node.js Π±ΡΡ
Π° ΠΈΠ΄Π΅Π½ΡΠΈΡΠΈΡΠΈΡΠ°Π½ΠΈ 11 Π³Π°Π΄ΠΆΠ΅ΡΠ°, ΠΊΠΎΠΈΡΠΎ ΠΌΠΎΠ³Π°Ρ Π΄Π° Π±ΡΠ΄Π°Ρ ΠΈΠ·ΠΏΠΎΠ»Π·Π²Π°Π½ΠΈ Π·Π° ΠΎΡΠ³Π°Π½ΠΈΠ·ΠΈΡΠ°Π½Π΅ Π½Π° Π°ΡΠ°ΠΊΠΈ, Π²ΠΎΠ΄Π΅ΡΠΈ Π΄ΠΎ ΠΈΠ·ΠΏΡΠ»Π½Π΅Π½ΠΈΠ΅ Π½Π° ΠΊΠΎΠ΄Π° Π½Π° Π°ΡΠ°ΠΊΡΠ²Π°ΡΠΈΡ. ΠΡΠ²Π΅Π½ Parse Server, Π΄Π²Π΅ Π΅ΠΊΡΠΏΠ»ΠΎΠ°ΡΠΈΡΠ°ΡΠΈ ΡΡΠ·Π²ΠΈΠΌΠΎΡΡΠΈ ΡΡΡΠΎ Π±ΡΡ
Π° ΡΡΡΠ°Π½ΠΎΠ²Π΅Π½ΠΈ Π² NPM CLI.
ΠΠ·ΡΠΎΡΠ½ΠΈΠΊ: opennet.ru
