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.