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