Avete mai sentito dire che esistono linguaggi di programmazione sicuri e altri meno?
Io si, ma mi sono sempre chiesto cosa ciò possa significare in pratica.
Credo sia arrivato il momento di scoprirlo assieme.
Per non perderci nei meandri dei linguaggi di programmazione cercherò di concentrarmi solo su una categoria, ovvero su quei linguaggi più adatti allo sviluppo di applicazioni web.
La sicurezza è un aspetto fondamentale nello sviluppo di applicazioni web ed ogni linguaggio ha le proprie caratteristiche e best practice da rispettare per garantire la sicurezza delle applicazioni. Naturalmente non tutti gli aspetti di sicurezza dipendono dal linguaggio di programmazione, è importante anche l'architettura generale del sistema e l'hardware su cui gira, per non parlare poi delle persone che in qualche modo interagiscono col processo di sviluppo. Noi cercheremo però di focalizzare il nostro interesse su quegli aspetti di sicurezza che hanno a che fare col linguaggio di programmazione impiegato o con i framework derivati.
Ci tengo a dire, prima di iniziare, che esistono differenze tra linguaggi intrinsecamente sicuri e best practices per lo sviluppo sicuro.
I primi, quelli intrinsecamente sicuri, possiedono delle funzionalità create apposta per impedire il verificarsi di problemi di sicurezza semplificando, in un certo qual modo, la vita al programmatore.
HTML e CSS
Tanto per cominciare, anche se non si tratta propriamente di linguaggi di programmazione, dobbiamo considerare HTML e CSS. Ricordiamo brevemente che HTML significa Hyper Text Markup Language e che serve per strutturare il contenuto delle pagine web mentre CSS significa Cascading Style Sheets e si utilizza per formattare i contenuti delle pagine web e per indicare al browser come questi devono essere visualizzati. In linea di massima HTML e CSS sono sempre in qualche modo impiegati nella realizzazione di applicazioni web ed è importante considerare l'interazione di questi, tra essi e con altri framework e linguaggi.
Per quanto riguarda la sicurezza in HTML e CSS possiamo affermare che trattandosi di linguaggi che si occupano della visualizzazione del contenuto dell'applicazione o pagina web è di fondamentale importanza validare e sanificare gli input utente per prevenire attacchi di tipo HTML Injection, Cross-Site Scripting e minacce simili. Per migliorare la sicurezza è consigliato l'uso di un layer aggiuntivo chiamato Content Security Policy (CSP). Attraverso le CSP lo sviluppatore può definire quali risorse possono essere caricate dal browser per ogni pagina, attenuando così i rischi di attacchi XSS, Clickjacking e simili.
Python
Uno dei linguaggi più utilizzati per produzione di applicazioni web è Python. In particolare due dei framework più noti che permettono lo sviluppo in Python sono Django e Flask.
Per quanto riguarda Django, ricordiamo che si tratta di un framework web open source per lo sviluppo di applicazioni web con il linguaggio Python. Questo framework è stato progettato per facilitare la creazione di applicazioni web complesse e ad alte prestazioni in modo rapido e semplice. Tra le sue caratteristiche, di rilievo per la sicurezza, vi è la presenza di un sistema di autenticazione e autorizzazione integrato, che supporta la gestione degli utenti, dei permessi e delle sessioni. Inoltre Django ha adottato una architettura chiamata Model-View-Template (MVT) allo scopo di separare logicamente i dati dalla logica di presentazione e dalla logica di controllo, questo è da considerare sicuramente come un vantaggio dal punto di vista della sicurezza.
Questo tipo di architettura riduce i rischi che eventuale codice malevolo venga inserito o eseguito nel contesto errato, per esempio le SQL injection. Grazie all'autoescape automatico anche attacchi XSS possono essere evitati, infatti Django possiede una funzione che converte i caratteri speciali in ingresso, tramite template utente, in testo normale prevenendo così eventuali azioni dannose. I caratteri speciali vengono infatti così convertiti:
<
diventa <
>
diventa >
&
diventa &
"
diventa ".
Django migliora la protezione da attacchi Cross-Site Request Forgery utilizzando token che assicurano che le richieste provengano da fonti autorizzate.
Flask a differenza di Django è un framework di sviluppo molto leggero che richiede, se necessaria, l'implementazione manuale di molte funzionalità di sicurezza come la protezione CSRF. L'uso di estensioni di sicurezza come Flask-Security può aiutare a rafforzare la protezione dell'applicazione.
Javascript
JavaScript è un linguaggio di programmazione essenziale per lo sviluppo web, utilizzato per creare contenuti dinamici e interattivi nei siti web. Funziona sia lato client, per migliorare l'esperienza utente, che lato server, grazie a runtime come Node.js, permettendo la creazione di applicazioni web scalabili e performanti. Oltre al web, è impiegato nello sviluppo di app mobile, desktop e nell'Internet of Things (IoT).
Per quanto riguarda la sicurezza occorre differenziare tra lato client e lato server.
Per quanto attiene il lato client, il codice viene eseguito nel browser dell'utente, ed è vulnerabile a manipolazioni e attacchi XSS. È dunque di cruciale importanza evitare le injection di codice non sicuro e gestire correttamente i dati provenienti dall'utente.
Con riferimento alla gestione delle vulnerabilità in Javascript, come in altri linguaggi, occorre utilizzare librerie di terze parti verificate e aggiornate, e applicare politiche di sicurezza rigorose come la CSP.
Lato server (Node.js): Evitare l'esecuzione di codice non attendibile e implementare pratiche sicure per la gestione delle dipendenze e la configurazione del server, adottando misure e metodologie atte a garantire che le librerie e i componenti software esterni utilizzati in un progetto non introducano vulnerabilità o problemi di sicurezza.
PHP
PHP (Hypertext Preprocessor) è un linguaggio di scripting lato server ampiamente utilizzato per lo sviluppo web. E' stato progettato per creare contenuti dinamici e interattivi su pagine web. La sua facilità d'uso, unita a una curva di apprendimento accessibile, ha reso PHP uno dei linguaggi più popolari per lo sviluppo di siti e applicazioni web. PHP è particolarmente adatto per la gestione di database, la generazione di pagine HTML dinamiche e l'integrazione con vari sistemi di gestione dei contenuti (CMS) come WordPress, Drupal e Joomla. PHP dispone di un'ampia gamma di librerie e framework, come Laravel e Symfony.
PHP è stato molto criticato per problemi di sicurezza ma ultimamente sono state introdotte funzionalità di sicurezza migliorate. In ogni caso è importante sanificare l'input utente e utilizzare funzioni sicure per le query SQL, per esempio attraverso l'uso di librerie come PHP Data Object, per prevenire SQL injection. E' inoltre necessario mantenere il server PHP sempre aggiornato e configurare correttamente le impostazioni di sicurezza.
Ruby
Ruby è un linguaggio di programmazione dinamico, interpretato e orientato agli oggetti. Conosciuto per la sua sintassi semplice ed espressiva ed apprezzato per la sua capacità di favorire la produttività degli sviluppatori. Ampiamente utilizzato per lo sviluppo web grazie a framework come Ruby on Rails, che semplifica la creazione di applicazioni web robuste e scalabili. Oltre al web development, Ruby trova applicazione anche nello scripting, nell'automazione dei task e nello sviluppo di applicazioni desktop.
Dal punto di vista sicurezza, Ruby on Rails come framework per lo sviluppo di applicazioni web, fornisce diverse protezioni integrate per prevenire vulnerabilità comuni come XSS (Cross-Site Scripting), SQL injection e CSRF (Cross-Site Request Forgery). Per quanto riguarda XSS vale il concetto di "escaping" automatico dei dati di output, ciò significa che i dati inseriti dagli utenti sono automaticamente filtrati per evitare che codice JavaScript dannoso venga eseguito nel browser. Invece, per prevenire SQL Injection Rails utilizza un ORM (Object-Relational Mapping) chiamato ActiveRecord che automatizza la generazione di query SQL parametrizzate. In questo modo previene efficacemente l'SQL injection, in quanto i parametri delle query vengono trattati separatamente dai comandi SQL, evitando l'inserimento di codice SQL dannoso direttamente nelle query. In merito ad attacchi di tipo CSRF (Cross-Site Request Forgery), Rails implementa l'uso di token CSRF generati automaticamente. Questi token vengono inclusi in ogni form e richiesta AJAX generata da Rails. Il framework verifica che il token CSRF inviato corrisponda a quello generato dal server, impedendo così che le richieste provenienti da siti esterni non autorizzati siano eseguite.
Un ulteriore meccanismo di sicurezza, chiamato "Strong Parameters", è stato introdotto in Rails per controllare quali parametri sono accettabili. Questo aiuta a prevenire l'inserimento di dati non desiderati o malevoli attraverso le richieste HTTP.
Java
Java è un linguaggio di programmazione ad alto livello, orientato agli oggetti e fortemente tipizzato, creato negli anni '90. È uno dei linguaggi più popolari e diffusi nel mondo dello sviluppo software, grazie alla sua portabilità, alla robustezza del suo sistema di tipizzazione e alla sua ampia adozione sia in ambito enterprise sia nel settore delle applicazioni desktop e mobili. Java è molto conosciuto anche grazie alla sua virtual machine (JVM) che consente l'esecuzione del codice Java su diverse piattaforme senza la necessità di doverlo ricompilare. Oltre alla libreria standard, esiste un vasto ecosistema di framework e strumenti di sviluppo, come Spring Framework, che semplificano la creazione di applicazioni scalabili e robuste per il web e altri contesti.
Per quanto riguarda gli aspetti di sicurezza, Spring Security è un modulo potente per gestire autenticazione e autorizzazione, offrendo protezione contro CSRF e altre minacce.
L'uso di Java e dei suoi framework richiede una gestione accurata della configurazione per prevenire l'accesso non autorizzato e la divulgazione di dati sensibili. Mantenere aggiornato l'ambiente di runtime (JVM) e il framework stesso è cruciale per evitare vulnerabilità note.
C# (C Sharp)
C# è un linguaggio di programmazione sviluppato da Microsoft nel 2000 come parte della piattaforma .NET. Si tratta di un linguaggio orientato agli oggetti, fortemente tipizzato e progettato per essere robusto, sicuro e adatto allo sviluppo di una vasta gamma di applicazioni tra cui siti e applicazioni Web.
C# combina elementi presi da C, C++ e Java, offrendo una sintassi moderna e intuitiva che facilita lo sviluppo di software complesso. È noto per la sua affidabilità, prestazioni elevate e per il supporto integrato per il garbage collection, che semplifica la gestione della memoria. C# è ampiamente utilizzato per lo sviluppo di applicazioni desktop Windows, applicazioni web tramite ASP.NET, applicazioni mobile con Xamarin e una varietà di altre soluzioni basate sulla piattaforma .NET, comprese le applicazioni cloud con Azure. Grazie alla sua interoperabilità con altre tecnologie Microsoft e alla sua continua evoluzione attraverso il framework .NET Core e .NET 5 e successivi, C# continua a essere una scelta popolare tra gli sviluppatori per la creazione di software robusto e scalabile.
In particolare, parlando di sicurezza nello sviluppo di applicazioni Web con ASP.NET occorre dire che offre strumenti avanzati per la protezione contro attacchi XSS, CSRF e SQL injection. Tra questi ASP.NET Identity
per gestire in modo sicuro l'autenticazione e l'autorizzazione degli utenti.
Per riassumere, se dovessi stilare una graduatoria tra i differenti sistemi analizzati (seppur molto sommariamente) attribuendo punteggi da 0 a 10, direi che:
Java: 10. Ottima sicurezza intrinseca, gestione robusta della memoria e forte tipizzazione. Framework come Spring Security offrono protezioni avanzate contro molte vulnerabilità comuni.
Ruby (Ruby on Rails): 9. Fornisce protezioni integrate contro XSS, SQL injection e CSRF grazie a meccanismi come ActiveRecord e i token CSRF generati automaticamente.
C# (ASP.NET): 9. ASP.NET offre strumenti avanzati per la protezione contro attacchi XSS, CSRF e SQL injection, inclusi meccanismi come ASP.NET Identity e l'implementazione automatica di token CSRF.
Python (Django): 8. Include una serie di misure di sicurezza come il sistema di autenticazione integrato, il supporto per template sicuri e la gestione delle sessioni.
PHP: 7. Ha migliorato significativamente la sua sicurezza nel corso degli anni, ma richiede attenzione nella gestione delle query SQL e nella validazione degli input per prevenire SQL injection e altre vulnerabilità comuni.
JavaScript: 6. E' vulnerabile agli attacchi XSS, soprattutto quando eseguito lato client. L'uso di librerie di terze parti e politiche di sicurezza come CSP sono fondamentali per mitigare questi rischi.
Python (Flask): 6. E' un framework più leggero rispetto a Django e richiede una maggiore implementazione manuale di funzionalità di sicurezza come la protezione CSRF. L'uso di estensioni come Flask-Security può migliorare la sicurezza dell'applicazione.
HTML e CSS: 5. Pur essendo essenziali per la strutturazione e la presentazione delle pagine web, HTML e CSS non offrono nativamente meccanismi di sicurezza avanzati. La sanitizzazione degli input è cruciale per prevenire attacchi XSS.
E' ovvio che questa graduatoria si basa su considerazioni generali e non esclude la possibilità che, rispettando le best practices dei differenti linguaggi e framework e con le corrette configurazioni, tutti questi linguaggi possano essere utilizzati in modo sicuro per lo sviluppo di applicazioni web.
Consigli Generali sulla Sicurezza
Nei paragrafi precedenti abbiamo visto alcune caratteristiche di sicurezza dei linguaggi di programmazione più utilizzati in ambito sviluppo di applicazioni Web. Non dobbiamo però mai dimenticare, nonostante gli aiuti diretti dei linguaggi di programmazione, di applicare sempre e comunque le best practices per lo sviluppo sicuro, brevemente riassunte qui sotto:
- Aggiornamenti: Mantenere sempre aggiornato il software, inclusi i linguaggi di programmazione, framework e librerie.
- Input Sanitation: Validare e sanificare tutti i dati in ingresso per prevenire iniezioni di codice.
- Autenticazione e Autorizzazione: Implementare meccanismi robusti per garantire che solo gli utenti autorizzati possano accedere a determinate funzionalità.
- Crittografia: Utilizzare protocolli di crittografia per proteggere i dati in transito e a riposo.
- Log e Monitoraggio: Tenere traccia delle attività sospette e monitorare l'integrità del sistema.
Per finire, programmare è anche una questione di collaborazione e buonsenso.
Scrivere e leggere il codice da soli non è bene. Occorre scrivere il codice, commentarlo, e farlo leggere e revisionare ad un altro programmatore.
Ricordiamo sempre il detto: quattro occhi vedono meglio di due!
Alessandro Rugolo
Per approfondire:
- https://618media.com/en/blog/web-security-with-css-best-practices/
- https://www.c-sharpcorner.com/article/c-sharp-security-best-practices-for-secure-coding/
- https://docs.djangoproject.com/en/5.0/topics/security/
- https://learn.microsoft.com/it-it/troubleshoot/developer/webapps/aspnet/development/security-overview
- https://www.secureworld.io/industry-news/ultimate-html-css-security-checklist
- https://www.cloudflare.com/it-it/learning/security/what-is-web-application-security/
- https://www.linkedin.com/pulse/introduction-computer-programming-languages-chukwuebuka-ejie-vi6mf/
- https://w3techs.com/technologies/history_overview/programming_language