WebHU - Programozási kérdések és válaszok

Hogyan korlátozhatom a csomóponti repl példányokat, hogy ne férhessenek hozzá a globális hatókörhöz?

Amikor létrehoz egy új repl példányt a kódban, az automatikusan hozzáfér a globális hatókörhöz tartozó bármihez. Módosíthatja a repl környezetet úgy, hogy néhány egyéni változót megjelenítsen a helyi hatókörben, hogy a repl hozzáférhessen hozzájuk, de nem látok egyszerű módot a globális hatókörhöz való hozzáférés megszüntetésére. Bárcsak egy új, üres globális hatókört adhatnék a repl-nek.

Itt van egy példa repl példány:

var repl = require('repl'),
    msg = "Hello world!";
repl.start('> ').context.msg = msg;

Ebben a válaszban a következőket írtam be:

for (var key in global) {
    console.log(key);
}

Ami a következő listát eredményezte:

  • ArrayBuffer
  • Int8Array
  • Uint8Array
  • Uint8ClampedArray
  • Int16Array
  • Uint16Array
  • Int32Array
  • Uint32Array
  • Float32Array
  • Float64Array
  • DataView
  • DTRACE_NET_SERVER_CONNECTION
  • DTRACE_NET_STREAM_END
  • DTRACE_NET_SOCKET_READ
  • DTRACE_NET_SOCKET_WRITE
  • DTRACE_HTTP_SERVER_REQUEST
  • DTRACE_HTTP_SERVER_RESPONSE
  • DTRACE_HTTP_CLIENT_REQUEST
  • DTRACE_HTTP_CLIENT_RESPONSE
  • COUNTER_NET_SERVER_CONNECTION
  • COUNTER_NET_SERVER_CONNECTION_CLOSE
  • COUNTER_HTTP_SERVER_REQUEST
  • COUNTER_HTTP_SERVER_RESPONSE
  • COUNTER_HTTP_CLIENT_REQUEST
  • COUNTER_HTTP_CLIENT_RESPONSE
  • globális
  • folyamat
  • GLOBÁLIS
  • gyökér
  • Puffer
  • setTimeout
  • setInterval
  • clearTimeout
  • clearInterval
  • setAzonnali
  • tiszta Azonnali
  • konzol
  • modult
  • igényelnek
  • üzenet
  • _
  • kulcs

Láthatja, hogy a msg változónk hozzáadásra került, ami nagyszerű, de sok globális változót nem akarok felfedni. Szeretnék feltárni néhányat a kevésbé ártalmasak közül, mint például a setTimeout, console stb., de semmiképpen nem az olyanokat, mint a require, process stb. Tudja valaki, hogyan tudnám ezt leküzdeni anélkül, hogy teljesen új gyermekfolyamatot szülnék?


  • Lehetséges with-árnyékolni az említett változókat (valamint a globális hatókör változót is). Bár még mindig vannak módok ennek elkerülésére (például visszahívásban vagy kötésben a megadott this nélkül). 16.10.2013
  • Nem vagyok benne 100%-ig biztos, de nem hiszem, hogy a megkerülési módok valóban megkerülnék a replben. Megpróbáltam az console.log(this);-t egy időtúllépésből végrehajtani, és a megjelenített objektum egy egyéni objektum volt, amely nyilvánvalóan a setTimeouthoz kapcsolódik, nem pedig a globális hatókörhöz. Létrehoztam egy függvényt is, amely megjeleníti a this értéket, majd létrehoztam egy új függvényt a bind használatával, amely a null értéket adja meg a this számára, és csak egy üres objektum jelenik meg. 16.10.2013

Válaszok:


1

Nem tudom, hogy ez a legjobb megoldás-e, de sikerült megvalósítanom. A repl környezeti objektuma az a globális objektum. Ez csak automatikusan kiegészül mindennel a global-től. Ez azt jelenti, hogy ismételheti a rajta lévő tulajdonságokat, és eltávolíthatja azokat, amelyek nem érdekelnek.

https://gist.github.com/Chevex/7000130

// Function to determine if an array contains a specific value.
function contains(array, value) {
    for(var i = 0; i < array.length; i++) {
        if(array[i] === value) return true;
    }
    return false;
}

var repl = require('repl'),
    newRepl = repl.start('> ');

var allowedGlobals = ['ArrayBuffer', 'Int8Array', 'Uint8Array', 'Uint8ClampedArray', 'Int16Array', 'Uint16Array', 'Int32Array',
    'Uint32Array', 'Float32Array', 'Float64Array', 'DataView', 'Buffer', 'setTimeout', 'setInterval',
    'clearTimeout', 'clearInterval', 'console', '_'];

for (var key in newRepl.context) {
    if (!contains(allowedGlobals, key)) {
        delete newRepl.context[key];
    }
}

Elég bosszantó, hogy globális változókból álló sztringet kell fenntartanom, amit engedélyezni akarok, de ez legalább fehérlistára teszi őket. Ha a csomópont frissít, és valami újat ad hozzá a globális hatókörhöz, akkor nem jelenik meg addig, amíg kifejezetten hozzá nem adom a listához.

Ha a repl parancsokat is engedélyezőlistára kell tennie, vagy meg kell szüntetnie a repl hozzáférését a csomóponti alapmodulokhoz, tekintse meg ezt a kérdést.

15.10.2013
  • Ezzel a felhasználó hozzáférhet a fs-hez. Azzal könnyen elpusztítanak mindent. 08.04.2015
  • @woverton Ez a kérdés nem erről szólt. Azonban egyszerűen megszüntetheti a repl alapértelmezett hozzáférését az alapvető modulokhoz, ha a repl elindítása előtt beállítja a repl._builtinLibs = []; értéket. Ez kiküszöböli a fs modult, valamint a többi csomóponti magmodult alapértelmezés szerint. Lásd ezt a kérdést hogy. Ne feledje, hogy nem támogatom válaszának nyilvános hozzáférhetővé tételét. Valószínűleg még mindig vannak szélső esetek, például kezeletlen kivételek. 08.04.2015
  • Új anyagok

    A rádiógomb ellenőrzött eseményének használata a jQueryben
    Ebben a cikkben látni fogjuk, hogyan kell dolgozni a jquery választógombbal ellenőrzött eseményeivel. A választógombok HTML gombok, amelyek segítenek kiválasztani egyetlen értéket egy csoportból...

    Körkörös függőségek megoldása terraformban adatforrásokkal – lépésről lépésre
    Mi az a körkörös függőségek Dolgozzunk egy egyszerű eseten, amikor az SQS-sor és az S3-vödör közötti körkörös függőség problémája van egy egymástól függő címkeérték miatt. provider..

    Miért érdemes elkezdeni a kódolást 2023-ban?
    01100011 01101111 01100100 01100101 — beep boop beep boop Világunk folyamatosan fejlődik a technológia körül, és naponta fejlesztenek új technológiákat a valós problémák megoldására. Amint..

    🎙 Random Noise #2  – Örökbefogadás és hit
    az analitika íratlan világának gondozása Szeretné, hogy ezek a frissítések a postaládájába kerüljenek? Iratkozzon fel itt . "Ha önvezető autókat gyártanak, akkor mi miért ne..

    A legrosszabb politika és prediktív modellek májátültetésre jelöltek számára az Egyesült Államokban
    A máj (vagy óangolul lifer) az emberi test legnehezebb belső szervére utal, amely csendesen működik a nap 24 órájában. Mit csinál a máj? 500 feladatot hajt végre a szervezet egészségének..

    5 webhely, amely 2022-ben fejleszti front-end fejlesztői készségeit
    Frontendmentor.io A tényleges projektek létrehozásával a Frontendmentor.io segítséget nyújt a front-end kódolási képességeinek fejlesztésében. A kódolást azután kezdheti meg, hogy..

    Mikor kell használni a Type-t az interfészhez képest a TypeScriptben?
    A TypeScript a JavaScript gépelt szuperkészlete, amely statikus gépelést ad a nyelvhez. Ez megkönnyíti a robusztus és karbantartható kód írását azáltal, hogy a hibákat a fordítási időben..