Sicurezza Javascript - Wrapping del codice in una funzione anonima



by   |  LETTURE 3760

Sicurezza Javascript - Wrapping del codice in una funzione anonima

Proseguiamo il nostro studio sulla sicurezza con qualcosa di più raffinato ed efficace cercando di impedire l'accesso al gioco limitando la visibilità di funzioni e variabili del nostro codice al mondo esterno.


Come spiegato in precedenza se una proprietà o un metodo sono definiti al di fuori di una funzione essi sono considerati globali e quindi accessibili dall'esterno, si pensi ad esempio alla console javascript del browser o a file inclusi nel nostro codice da malintenzionati.

In Javascript, è possibile nidificare le funzioni, pensiamo a come viene dichiarato un oggetto:

 function funzioneEsterna() {    function funzioneInterna() {       // codice     } }
Se prendiamo in esame l'esempio precedente vediamo che è possibile chiamare funzioneEsterna(), ma la visibilità della funzioneInterna() si limita al campo di applicazione della funzioneEsterna(), ciò significa che funzioneInterna è un metodo privato di funzioneEsterna().

Ne deriva sostanzialmente lo stesso principio delle variabili in Javascript:

 var variabileGlobale;  function funzioneEsterna() {    var variabileLocale; }
Che in termini di funzioni corrisponde a:
 function funzioneGlobale() {         var funzioneLocale1 = function() { 	   // Sono una funzione anonima ma funzioneLocale1 è un riferimento a me    };     function funzioneLocale2() {       // Sono una funzione nominata    } }
Nello scenario precedente, è possibile chiamare funzioneGlobale() da qualsiasi punto del codice, ma non si può chiamare funzioneLocale1 o funzioneLocale2.

Quello che facciamo scrivendo (function () {... codice ...}) (), è inserire il codice all'interno di una funzione letterale (nel senso che tutto l 'oggetto è in realtà una funzione). Dopo di che, si sta auto-richiamando la funzione (le parentesi () alla fine).


Il grande vantaggio di questo metodo, come ho detto prima, è che si possono avere metodi, funzioni e proprietà private:

 (function() {    var variabilePrivata;     function funzionePrivata() {      // codice    } })()
La cosa interessante è che si possono anche definire cose all'interno ed esporle al mondo esterno in questo modo:
 var myPlugin = (function() {  var variabilePrivata;   function funzionePrivata() {  }   return {     funzionePubblica1: function() {     },     funzionePubblica2: function() {     }  } })()
In questo caso sarà possibile richiamare myPlugin.funzionePubblica1(), ma non sarà possibile accedere a funzionePrivata().