Thoir ionnsaigh air Node.js tro bhith a’ làimhseachadh prototypes nì JavaScript

Rinn luchd-rannsachaidh bho Ionad Helmholtz airson Tèarainteachd Fiosrachaidh (CISPA) agus an Institiud Teicneòlais Rìoghail (An t-Suain) mion-sgrùdadh air iomchaidheachd modh truailleadh prototype JavaScript gus ionnsaighean a chruthachadh air an àrd-ùrlar Node.js agus tagraidhean mòr-chòrdte stèidhichte air, a’ leantainn gu coileanadh còd.

Bidh an dòigh truailleadh prototype a’ cleachdadh feart den chànan JavaScript a leigeas leat feartan ùra a chur ri freumh prototype nì sam bith. Faodaidh gum bi blocaichean còd (innealan) ann an tagraidhean aig a bheil buaidh aig seilbh a chaidh a chuir na àite; mar eisimpleir, dh’ fhaodadh gum bi structar mar ‘const cmd = options.cmd || “/ bin/sh”, agus thèid an loidsig atharrachadh ma thèid aig an neach-ionnsaigh air an togalach “cmd” a chuir na àite anns a’ phròtacal freumh.

Tha ionnsaigh shoirbheachail ag iarraidh gun urrainn don aplacaid dàta bhon taobh a-muigh a chleachdadh gus seilbh ùr a chruthachadh ann am prototype freumh an nì, agus gun tig an coileanadh sin tarsainn air inneal a tha an urra ris an t-seilbh atharraichte. Tha atharrachadh an prototype air a choileanadh le bhith a’ giullachd nan togalaichean seirbheis “__proto__” agus “Constructor” ann an Node.js. Bidh an togalach "__proto__" a 'tilleadh prototype clas an nì, agus tha an t-seilbh "neach-togail" a' tilleadh a 'ghnìomh a chaidh a chleachdadh gus an nì a chruthachadh.

Ma tha an sònrachadh “obj[a][b] = luach” ann an còd an tagraidh agus na luachan air an suidheachadh bho dhàta bhon taobh a-muigh, faodaidh neach-ionnsaigh “a” a shuidheachadh chun luach “__proto__” agus an togalach aca fhèin a chuir a-steach leis an ainm “b” agus an luach “luach” ann am freumh prototype an nì (obj.__proto__.b = luach;), agus bidh an togalach a tha suidhichte sa prototype ri fhaicinn anns a h-uile nì. Mar an ceudna, ma tha abairtean mar “obj[a][b][c] = luach” sa chòd, le bhith a’ suidheachadh “a” gu luach “constructor”, agus “b” gu “prototype” anns a h-uile nì a th’ ann mar-thà, faodaidh tu Mìnich seilbh ùr leis an ainm "c" agus an luach "luach".

Eisimpleir de bhith ag atharrachadh an prototype: const o1 = {}; const o2 = Rud ùr(); o1.__proto__.x = 42; // cruthaich seilbh “x” anns a’ bhunait prototype console.log (o2.x); // seilbh ruigsinneachd “x” bho nì eile // bidh an toradh 42, leis gun deach am prototype freumh atharrachadh tro nì o1, a tha cuideachd air a chleachdadh ann an nì o2

Eisimpleir de chòd so-leònte: gnìomh inntrigidhPoint (arg1, arg2, arg3){ const obj = {}; const p = obj[arg1]; p[arg2] = arg3; tilleadh p; }

Ma tha na h-argamaidean gnìomh inntrigidhPoint air an cruthachadh bho dhàta cuir a-steach, faodaidh neach-ionnsaigh an luach “__proto__” a thoirt seachad gu arg1 agus togalach a chruthachadh le ainm sam bith anns a ’phròtacal freumh. Ma bheir thu seachad arg2 an luach "toString" agus arg3 an luach 1, faodaidh tu an t-seilbh "toString" a mhìneachadh (Object.prototype.toString = 1) agus an aplacaid a thuisleadh tron ​​​​ghairm gu toString().

Tha eisimpleirean de shuidheachaidhean a dh'fhaodadh leantainn gu cur an gnìomh còd ionnsaigh a' gabhail a-steach cruthachadh nam feartan "prìomh", "slige", "às-mhalairt", "contextExtensions" agus "env". Mar eisimpleir, faodaidh neach-ionnsaigh seilbh “prìomh” a chruthachadh ann am freumh prototype nì, a’ sgrìobhadh ann an t-slighe chun sgriobt aige (Object.prototype.main = “./../../pwned.js”) agus thèid an togalach seo a ghairm aig àm cur an gnìomh ann an còd an togail feum ("my-package"), mura h-eil am pasgan a tha air a ghabhail a-steach a’ mìneachadh gu soilleir an t-seilbh “prìomh” ann am package.json (mura h-eil an togalach air a mhìneachadh, gheibhear e bhon prototype freumh). Faodar feartan “shell”, “exports” agus “env” a chuir nan àite san aon dòigh: let rootProto = Object.prototype; rootProto["exports"] = {".":"./changelog.js"}; rootProto["1"] = "/path/to/npm/scripts/"; // gairm brosnachaidh a dhìth ("./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"; // gairm brosnachaidh a dhìth ("bytes");

Rinn an luchd-rannsachaidh mion-sgrùdadh air pasganan 10 NPM leis an àireamh as motha de eisimeileachd agus lorg iad nach eil prìomh sheilbh aig 1958 dhiubh ann am package.json, bidh 4420 a’ cleachdadh slighean càirdeach anns na h-aithrisean feum aca, agus tha 355 gu dìreach a’ cleachdadh an API ionad-àithne.

Is e eisimpleir obrach brath airson ionnsaigh a thoirt air backend Parse Server a tha a’ dol thairis air seilbh evalFunctions. Gus comharrachadh nan so-leòntachd sin a dhèanamh nas sìmplidhe, chaidh inneal a leasachadh a tha a’ cothlamadh dhòighean sgrùdaidh statach agus fiùghantach. Rè deuchainn Node.js, chaidh innealan 11 a chomharrachadh a dh'fhaodar a chleachdadh gus ionnsaighean a chuir air dòigh a bheir gu buil còd an neach-ionnsaigh. A bharrachd air Parse Server, chaidh dà so-leòntachd so-ruigsinneach a chomharrachadh ann an CLI NPM.

Source: fosgailtenet.ru

Cuir beachd ann