JavaScript - DIEGOMETTIFOGO.COM
Transcript
JavaScript - DIEGOMETTIFOGO.COM
Capitolo 3 JavaScript JavaScript è un linguaggio di scripting client-side orientato agli oggetti che viene interpretato dal browser. 3.1 Cenni storici Caratteristica della storia di JavaScript è la velocità di sviluppo iniziale del progetto, che cercava di tenere il passo o anticipare la velocissima crescita di Internet e la diffusione del World Wide Web: una decina di giorni per l’interprete, esclusa però la classe Date, che venne messa a punto traducendo la classe Java util.Date in C (comprensiva del “millennium bug”). Nel 1995 Netscape decise di dotare il proprio browser di un linguaggio di scripting che permettesse ai web designer di interagire con i diversi oggetti della pagina (immagini, form, link, ecc.), ma soprattutto con le applet Java (programmi che permettono di interagire con l’utente). Infatti in quello stesso anno Netscape era particolarmente vicina alla Sun Microsystems (ideatrice di Java), con cui aveva stretto una partnership. Brendan Eich venne incaricato del progetto e inventò, inizialmente con il nome di Mocha, LiveScript (chiamato cosı̀ ad indicare la propria vivacità e dinamicità). Le due aziende il 4 dicembre 1995 annunciarono la nascita di questo nuovo linguaggio, descrivendolo come “complementare all’HTML e a Java”. La versione beta di Netscape Navigator 2.0 incorporava quindi LiveScript, ma (in omaggio a Java) Netscape decise di ribattezzare il nuovo linguaggio di scripting JavaScript. La versione 2.0 di Netscape Navigator fu un grande successo, ma i web designer non utilizzarono JavaScript per interagire con le applet Java (come avrebbe voluto Netscape), ma piuttosto per rendere più dinamiche le pagine: è in quest’anno che nacque nel web l’effetto di roll-over. Figura 3.1: Il logo di JavaScript Microsoft rispose a JavaScript in due modi: con l’introduzione di VBScript all’interno di Internet Explorer 3; con una propria versione di JavaScript, sotto molti aspetti simile all’originale, chiamata JScript (luglio 1996): JScript è dunque la versione di JavaScript supportata da Internet Explorer. A causa di alcune differenze presenti in Internet Explorer 3, Netscape e Sun decisero di standardizzare JavaScript e si affidarono all’European Computer Manufacturers Association (ECMA [10]). La standardizzazione incominciò nel novembre 1996 e fu adottata nel giugno 1997 da ECMA e nell’aprile 1998 da ISO (International Organization for Standardization). Attualmente siamo alla terza versione di ECMAScript, che dunque è figlio di JavaScript: oggi quando si parla di JavaScript, JScript ed ECMAScript sostanzialmente si indicano tre varietà dello stesso linguaggio. Bisogna poi tener conto che differenti versioni del browser implementano differenti versioni di JavaScript, quindi il modo di interpretare determinati costrutti potrebbe variare da una sottoversione del browser all’altra, oltre che da un browser all’altro. Infine JavaScript può anche essere utilizzato per scrivere delle applicazioni server side, nel caso che il web server sia configurato in modo opportuno, anche se questo tipo di utilizzo è un caso molto sporadico. 19 20 3.2 CAPITOLO 3� JAVASCRIPT Sicurezza JavaScript si potrebbe considerare sicuro per via di alcune limitazioni strutturali, in particolare l’uso della cosiddetta sandbox ; ad esempio, non si possono cancellare file dal disco rigido del client, ed è anche impossibile stabilire connessioni con i computer della rete, dalla quale il browser accede al web. La violazione delle policy di sicurezza JavaScript, in particolare quella “della stessa origine”, o “same origin”, potrebbe però portare alla divulgazione di contenuti riservati; non è una consolazione sapere che attacchi XSS possono servirsi anche di altri meccanismi, come ad esempio il protocollo SNMP. Al giorno d’oggi la problematica connessa a JavaScript (ed AJAX), sembra si trovi nella possibilità di effettuare richieste ingannevoli verso il server, che andrebbero rese sempre più difficoltose aggiungendo livelli di controllo tali da complicare la vita di potenziali attaccanti. Il problema è di non rendere a sua volta troppo complessa e difficile da mantenere la struttura dei programmi JavaScript. Un altro problema riguarda la possibilità di usare JavaScript per sfruttare difetti di progettazione contenuti in altri programmi con meno restrizioni di esecuzione, come i controlli Active-X e i plug-in come quello di Flash, che per la grande diffusione si prestano ad amplificare gli effetti di un eventuale attacco. Un incremento della sicurezza potrebbe venire dalla standardizzazione che sta mettendo in atto il consorzio OASIS [9], mettendo l’accento in più di un caso proprio sulla sicurezza. 3.3 Caratteristiche Il cambio di nome da LiveScript a JavaScript si rivelò fonte di grande confusione. Infatti non c’è una vera relazione tra Java e JavaScript; le loro somiglianze sono soprattutto nella sintassi (derivata in entrambi i casi dal linguaggio C), mentre le loro semantiche sono piuttosto diverse, e in particolare i loro object model non hanno relazione e sono ampiamente incompatibili. La necessità di specifiche comuni fu tuttavia alla base dello standard ECMA-262 per ECMAScript, di cui sono state pubblicate tre edizioni dal novembre 1996. La caratteristica principale di JavaScript è quella di essere un linguaggio interpretato. Il codice quindi non viene compilato bensı̀ c’è un interprete (incluso nel browser che si sta utilizzando) che esegue riga per riga, a tempo di esecuzione, quanto trascritto nello script. JavaScript presenta quindi tutte le caratteristiche di un normale linguaggio interpretato (e di conseguenza i suoi vantaggi e svantaggi) con una sintassi analoga a quella di un linguaggio compilato (essa è relativamente simile a quella di C, di C++ e di Java), quindi con la possibilità di utilizzare funzionalità tipiche dei linguaggi di programmazione ad alto livello (strutture di controllo, cicli, ecc.) e con in più anche la potenzialità di definire strutture più complesse, vicine a quelle adottate nei normali linguaggi object oriented (creazione di prototipi, istanziazione di oggetti, costruttori, ecc.). Un’altra caratteristica importante di JavaScript consiste nel suo essere un linguaggio debolmente tipizzato, quindi il tipo delle variabili può non essere assegnato in fase di dichiarazione e le variabili stesse vengono convertite in maniera automatica dall’interprete. Altri aspetti di interesse sono che il codice viene eseguito sul client, quindi il server non viene sollecitato. Ciò risulta essere un vantaggio in quanto con la presenza di script particolarmente complessi il server non verrebbe sovraccaricato. Di conseguenza però, nel caso di script che presentano una considerevole mole di dati, il tempo per lo scaricamento diventa rilevante. Inoltre, lavorando solamente sul client, ogni informazione che presuppone un accesso a dati in un database deve essere rimandata ad un linguaggio che effettua esplicitamente la transazione per poi restituire i risultati ad una o più variabili: operazioni del genere richiedono il caricamento della pagina stessa. Per superare questi limiti ci si può appoggiare ad AJAX (capitolo 5 nella pagina 29). JavaScript è un linguaggio di programmazione orientato agli oggetti con una sintassi vagamente basata sul C. Come il C, ha il concetto di parole chiave riservate, che rendono quasi impossibile espandere il linguaggio (essendo eseguito direttamente dal sorgente). Sempre come nel C, il linguaggio non ha propri costrutti di input o output; mentre il C si affida alle librerie I/O standard, un interprete JavaScript si basa su un programma ospite in cui è integrato. Ci sono molti programmi ospiti di questo tipo, di cui quelli relativi al web sono gli esempi più noti. JavaScript, se integrato in un browser, si collega tramite interfacce chiamate DOM (Document Object Model ) alle applicazioni, specialmente al lato server (web server) e al lato client (browser) delle applicazioni Internet, infatti molti siti web usano la tecnologia JavaScript lato client per creare interessanti applicazioni web dinamiche. Può usare Unicode e può valutare le espressioni regolari (introdotte nella versione 1.2). Si possono anche valutare le espressioni contenute in una stringa tramite una funzione particolare (eval). 3�4� INCOMPATIBILITÀ 21 Un uso principale basato su web è la scrittura di funzioni integrate nelle pagine HTML che interagiscono con il DOM del browser per compiere determinate azioni non possibili con il solo PHP o l’HTML statico: controllare i valori nei campi di input, nascondere o visualizzare determinati elementi, ecc. Sfortunatamente, gli standard DOM imposti dal W3C non sempre vengono rispettati dai vari browser, e browser diversi (anche a seconda del loro motore di rendering) espongono diversi oggetti o metodi allo script, ed è quindi spesso necessario implementare controlli aggiuntivi ad una funzione JavaScript per garantirne la compatibilità con ciascun browser. Al di fuori del web gli interpreti JavaScript sono integrati in diverse applicazioni (anche prive di interfacce programmabili via script) come alcuni prodotti della Adobe che supportano JavaScript nei file .pdf. La piattaforma Mozilla, che è alla base di molti diffusi browser web, usa JavaScript anche per implementare l’interfaccia utente e la logica di transazione dei suoi vari prodotti. Ciascuna di queste applicazioni fornisce il proprio modello a oggetti che dà accesso all’ambiente ospite, con il nucleo del linguaggio JavaScript che rimane per lo più invariato in ciascuna applicazione. Ci sono diverse implementazioni del nucleo del linguaggio JavaScript, tra le quali: KJS Rhino SpiderMonkey Narcissus NJS NGS Resin FESI SEE DMDScript 3.4 Incompatibilità Le varie implementazioni di JavaScript, come già accaduto per l’HTML, spesso non sono conformi agli standard, ma piuttosto sono costruite per funzionare con uno specifico browser web. L’attuale standard ECMAScript (terza edizione) dovrebbe essere teoricamente la base di tutte le implementazioni JavaScript, ma in pratica i browser Mozilla (e Netscape) usano JavaScript, Microsoft Internet Explorer usa JScript, e altri browser come Opera e Safari usano altre implementazioni ECMAScript, spesso con ulteriori caratteristiche non standard per permettere la compatibilità con JavaScript e JScript. JavaScript e JScript contengono molte caratteristiche che non sono parte dello standard ufficiale ECMAScript, e possono anche essere privi di diverse caratteristiche. In questo modo sono in parte incompatibili, il che porta gli sviluppatori a dover sopperire a tali problemi. Tra i due, JavaScript è più conforme allo standard: ciò significa che uno script redatto secondo gli standard ECMA probabilmente funzionerà con la maggior parte dei browser, ad eccezione di Internet Explorer (e anche il VBScript di Microsoft Internet Explorer non è JavaScript ed è incompatibile con lo standard ECMA). Un altro effetto è che ciascun browser potrebbe trattare lo stesso script in modo diverso, e ciò che funziona in un browser potrebbe non funzionare in un altro browser o persino in una diversa versione dello stesso browser� Come con l’HTML, è quindi raccomandabile scrivere codice conforme agli standard. Ci sono due tecniche principali per gestire le incompatibilità: il browser sniffing (letteralmente “annusare il browser”) e l’object detection (rilevazione dell’oggetto). Quando c’erano solo due browser che supportavano lo scripting (Netscape and Internet Explorer), il browser sniffing era la tecnica più diffusa: controllando un certo numero di proprietà del client che restituivano informazioni su piattaforma, browser e versione, era possibile per il codice capire esattamente in quale browser veniva eseguito. Più tardi, le tecniche di sniffing divennero più difficili da implementare, dato che Internet Explorer cominciò a “dissimulare” le sue informazioni sul client, per esempio fornendo informazioni sul browser sempre più inaccurate (i motivi di questo comportamento non sono ancora chiari...). Più tardi, quando altri browser 22 CAPITOLO 3� JAVASCRIPT dotati di scripting entrarono nel mercato, ciascuno con proprie informazioni su piattaforma, client e versione, il browser sniffing divenne molto più articolato. L’object detection si basa, invece, sul controllare l’esistenza della proprietà di un oggetto. Oggi, una combinazione di browser sniffing, object detection, e conformità agli standard come le specifiche ECMAScript e i CSS sono usati in varie proporzioni per tentare di assicurare che un utente non incontri errori dovuti al JavaScript.