CONTATTACI

Il tuo software è sicuro?

pic_0655

Con la crescita di economie come la Cina, le imprese Italiane si sono trovate a dover fronteggiare una concorrenza spietata fatta di spionaggio industriale e copie su larga scala del made in italy e in particolar modo sul design.

Sempre in tema di spionaggio industriale è recente infatti la notizia di un virus per Autocad capace di rubarne i file e di inviarli a provider Cinesi.

Da questi fatti si evince che la sicurezza del proprio sistema informativo non è da considerarsi un aspetto di secondaria importanza.

Scrivere software sicuro però non è alla portata di tutti: servono preparazione, esperienza e aggiornamento continuo.

Un’ottima fonte di informazioni è il sito OWASP il quale analizza le possibili minacce alla sicurezza, propone best practice nello sviluppo di software sicuro e fornisce tool per la ricerca automatica di vulnerabilità come OWASP ZAP.

Di particolare utilità il progetto Top 10 che classifica e analizza i 10 maggiori rischi di sicurezza per le applicazioni.

Il rispetto di queste pratiche assicura un buon margine di sicurezza e di conseguenza la salvaguardia dei dati sensibili del cliente.

Problematiche ricorrenti nello sviluppo di webapp 1/3: escaping

Cactus

Il primo di tre problemi ricorrenti nello sviluppo di webapp deriva dal corretto escaping dei dati inviati dal server al browser.

  • Questo problema sorge laddove l’utente può inserire dei dati nella nostra webapp;
  • non trattare opportunamente questi dati equivale a lasciare aperta la porta a malintenzionati;
  • l’escaping infatti è la soluzione a vulnerabilità come il XSS (Cross Site Scripting);
  • conoscerlo e saperlo gestire correttamente è essenziale per sviluppare webapp sicure;

In generale in una webapp va fatto l’escaping di tutto ciò che viene generato lato server e che poi viene interpretato dal browser.

Tutte le volte che si sta generando una pagina HTML da inviare al browser utilizzando dati provenienti dal database o dall’utente, bisogna chiedersi se e come bisogna farne l’escaping.

In particolare se si sviluppa in PHP bisogna conoscere per ogni elemento della pagina (html, css, javascript, …) che si sta creando, le apposite funzioni e gli appositi accorgimenti per effettuare l’escaping del contenuto.

Le funzioni della tabella seguente se utilizzate con gli opportuni accorgimenti possono essere la base per effettuare un corretto escaping.

elemento funzione PHP
HTML htmlentities/htmlspecialchars
valore degli attributi HTML htmlentities/htmlspecialchars
JavaScript addslashes/json_encode
URL/URI rawurlencode/urlencode

Se il framework che utilizziamo si preoccupa di effettuare correttamente l’escaping di questi elementi bene, diversamente ce ne dovremo occupare noi.

Come si combatte la crisi?

Desert dandelion flower.  Scenes from a trip to Anza Borrego State Park in southern California, March 23-26, 2009

Questa è la domanda che in molti si pongono da qualche anno a questa parte.

Molti suggeriscono che la qualità dovrebbe essere la unique selling proposition del made in italy per poter competere nel mondo.

Purtroppo la qualità costa e in tempi di crisi tutti cercano di tagliare le spese: dalle famiglie alle aziende il trend è quello di scegliere ciò che costa meno.

Sicuramente quindi, mentre tentiamo di convincere i nostri clienti che la qualità paga, internamente possiamo migliorare la situazione riducendo le inefficienze e tagliando i costi superflui.

Per raggiungere i seguenti scopi noi di Garda Informatica consigliamo le seguenti strategie:

  • Realizzare un’infrastruttura informatica intelligente che sia in grado di verificare il proprio corretto funzionamento;
  • Esternalizzare la gestione dell’infrastruttura informatica aziendale;
  • Impiegare software sviluppato su misura per ridurre al minimo gli sprechi di tempo e automatizzare il più possibile i processi aziendali.

Lo scenario di molte PMI italiane è quello di infrastrutture informatiche gestite in modo dilettantistico da personale non qualificato e di processi aziendali guidati da fogli excel o peggio dal cartaceo.

In una condizione del genere non è possibile pensare di riuscire ad avere una visione d’insieme della propria attività d’impresa e quindi non sarà possibile individuare i processi inefficienti, i costi nascosti e i margini di miglioramento in generale.

Come integrare l’utilizzo di fogli excel con il proprio gestionale?

Spreadsheet

L’evoluzione del sistema informativo aziendale in genere procede dal cartaceo al foglio excel e dal foglio excel a un gestionale vero e proprio.

Per poter fare quest’ultimo passaggio nella maniera più graduale e indolore possibile, bisogna riuscire a leggere i dati contenuti in questi fogli excel per poi immagazzinarli nel database del gestionale.

Accedere a un foglio excel può diventare un problema dal momento che le vecchie versioni del suo formato sono chiuse e binarie.

La stessa Microsoft ci viene però in aiuto grazie ai driver ODBC per Excel.

Installando MS Office o il pacchetto Microsoft Access Database Engine saremo in grado di registrare come sorgenti dati ODBC dei normali fogli Excel e potremo quindi leggerne e manipolarne i dati attraverso dei normali statement SQL.

Per capire più nel dettaglio questo approccio è sufficiente guardare le schermate di questo semplice tutorial.

Alcuni aspetti interessanti di questo approccio sono:

  • l’utilizzo dei tipi dato SQL;
  • l’esecuzione automatica delle formule eventualmente presenti nel foglio excel;
  • la possibilità di modificare il contenuto del foglio excel attraverso, per esempio, lo statement di INSERT INTO;

In modo trasparente è possibile quindi integrare la gestione dei processi aziendali fatta attraverso fogli excel con gestionali su database relazionali.

L’unica tipologia di casi in cui questa soluzione non basta è quando si vogliono poter leggere e gestire anche le proprietà di una cella, come per esempio i collegamenti ipertestuali: in Excel al valore contenuto in una cella si può associare il percorso di un file su disco o un URL. Questo tipo di informazione, assieme alle proprietà di formattazione della cella, si perdono con l’approccio appena discusso.

Per poter gestire anche questi dati bisogna utilizzare un approccio più specifico e in particolare, se si programma in PHP, ci si può affidare all’utilizzo della libreria PHPExcel in grado di leggere quasi tutti i formati Excel e soprattutto di accedere ai dati delle celle oltre al valore contenuto: font, bordi, colori, hyperlinks, ecc.

Quanto costa un gestionale?

SoldiUna domanda da non sottovalutare quando si valuta l’adozione di un nuovo gestionale in azienda è: quanto mi costa?

Naturalmente non ci si può limitare a calcolare il costo delle sole licenze, ma bisogna valutare anche altri fattori che concorrono a determinare il TCO ovvero il “Total Cost of Ownership”.

Parlando di gestionali “prefabbricati” bisogna infatti chiedersi:

  • Per far girare il nuovo gestionale dovrò acquistare del nuovo hardware? Un nuovo server, una nuova rete, delle soluzioni per il backup?
  • Dovrò acquistare del nuovo software? Magari le licenze di utilizzo di un database o di un web server proprietario?
  • Se ho già una base dati, quanto mi costerà la migrazione dei vecchi dati sulla nuova soluzione?
  • Quanto mi costerà il canone annuo di manutenzione?
  • Quanto ore di consulenza ci vorranno per modellare il nuovo gestionale e per cercare di farlo aderire ai miei processi?
  • Quante ore di formazione serviranno per istruire i miei dipendenti all’utilizzo efficente ed efficace del nuovo gestionale?
  • Quanto mi costeranno le personalizzazioni del gestionale necessarie per la mia realtà?
  • Quanto mi costeranno i riallineamenti di queste personalizzazioni all’uscita di nuove release?

Inevitabilmente, facendo due conti, ci si renderà conto che di tutte queste voci, le licenze sono quelle che impattano meno, specialmente se si pensa di utilizzare il nuovo gestionale per qualche anno.

Perché non puntare invece su una soluzione su misura?

Un gestionale sviluppato su misura infatti:

  • non ha costi di licenza e i costi di sviluppo non dipendono dal numero di utenti che andranno ad utilizzare il gestionale;
  • non richiede nuovo hardware: si può adattare a quello già esistente oppure si può sviluppare per l’hardware di scelta del cliente;
  • se sviluppato utilizzando prodotti open source, non richiede l’acquisto di altro software;
  • non richiede alcuna modellazione: implementa già i flussi di lavoro del cliente;
  • non richiede formazione: è stato pensato per essere di immediato utilizzo da parte del cliente;
  • non richiede personalizzazioni né riallineamenti: è già cucito su misura delle specifiche esigenze del cliente;
  • la migrazione dei dati è già inclusa nei costi di sviluppo;
  • la correzione dei bug è già inclusa nei costi di sviluppo e quindi non è necessario stipulare un canone di manutenzione annuale;

In alternativa si può prendere il meglio dei due mondi utilizzando un software di fatturazione “prefabbricato” a cui affiancare un software gestionale verticale sviluppato su misura. Per stimare il costo di un software su misura abbiamo realizzato un calcolatore che permette di avere un’idea di tempi e costi di realizzazione .

Linux: come ricevere una mail quando il disco è quasi pieno

a server rack

Il disco del server aziendale ogni tanto si riempie bloccando tutto: gestionale, database ecc.

Se per voi questo scenario è comune forse avete trovato il modo per risolverlo, ma andiamo con ordine.

Mi è capitato nella mia carriera di aver a che fare con software enterprise che hanno la brutta abitudine di non ripulire mai i file di log che periodicamente producono (es. IBM DB2) con conseguente riempimento periodico dello spazio su disco e blocco di loro stessi in primis e a catena di tutto il resto, magari l’ERP della vostra azienda.

Sicuramente esistono dei software molto belli e molto costosi che potrebbero tener controllato lo stato del server e prevenire questi casi, fortunatamente per voi se il SO del vostro server è Linux non ne avete bisogno.

In questo caso infatti è sufficiente predisporre un piccolo script che periodicamente controlla lo stato di occupazione dei dischi e vi notifica via mail di un eventuale superamento di una soglia di occupazione predefinita.

Per realizzare uno script del genere dobbiamo essere in grado di fare sostanzialmente due cose:

  1. controllare lo stato di occupazione dei dischi
  2. inviare una mail

Il comando Linux per soddisfare il primo requisito è df che, se lanciato con l’opzione -h, ci darà una visione d’insieme umanamente leggibile sullo stato di occupazione delle partizioni.

es.

srv02:~ # df -h
Filesystem Size Used Avail Use% Mounted on
/dev/sda2 98G 7.4G 91G 8% /
udev 1015M 120K 1014M 1% /dev

Per poter trattare però il suo output in maniera automatica ci conviene utilizzarne la versione seguente:

srv02:~ # df -a -P
Filesystem 1024-blocks Used Available Capacity Mounted on
/dev/sda2 102748540 7692172 95056368 8% /
proc 0 0 0 - /proc
sysfs 0 0 0 - /sys
debugfs 0 0 0 - /sys/kernel/debug
udev 1038388 120 1038268 1% /dev
devpts 0 0 0 - /dev/pts
securityfs 0 0 0 - /sys/kernel/security

Il comando Linux per soddisfare il secondo requisito è mail che appunto serve per mandare mail da riga di comando.

Mettendo tutto insieme otteniamo qualcosa di simile

#!/bin/bash

set -x

SIZE_PERC_LIMIT=75
TO="admin@domain.it"
CC="cto@domain.it"
NOREPLY="$(hostname)-noreply@domain.it"
FROM="$(hostname)@domain.it"

df -a -P | grep '^/dev/' | tr -s ' ' | cut -d' ' -f5 | grep '%' | cut -d% -f1 | while read value; do
if [ $value -ge $SIZE_PERC_LIMIT ]; then

echo "*** $(hostname) ha raggiunto la soglia di occupazione del ${value}% di una partizione" > /tmp/check_disco.log
echo "*** di seguito viene riportato l'output del comando: df -h" >> /tmp/check_disco.log
df -h >> /tmp/check_disco.log

SUBJECT="ATTENZIONE $(hostname): stato occupazione partizioni"

mail -c "$CC" -r "$FROM" -R "$NOREPLY" -s "$SUBJECT" "$TO" < /tmp/check_disco.log

break
fi
done

L’unica riga che credo richieda una spiegazione è la 11 la quale ha come scopo quello di ottenere per ogni partizione la percentuale di occupazione e per farlo compie in sequenza le seguenti operazioni:

  1. df -a -P: stampa lo stato di tutte le partizioni utilizzando il formato POSIX. Questo dovrebbe favorire la portabilità di questo script.
  2. grep '^/dev/': seleziona solo le partizioni che ci interessano (ovviamente l’espressione regolare potrebbe essere modificata a seconda della nomenclatura delle vostre partizioni) scartando cioè filesystem virtuali, dispositivi di rete, ecc.
  3. tr -s ' ': rimpiazza le sequenze di spazi con spazi singoli per facilitarne la suddivisione con il comando successivo
  4. cut -d' ' -f5: taglia le righe in campi separati da spazi e ne prende il quinto: quello della percentuale di occupazione
  5. grep '%': tiene solo i valori percentuali scartando eventuali trattini
  6. cut -d% -f1: separa la percentuale dal valore e tiene quest’ultimo
  7. while read value; do: il valore letto lo memorizza nella variabile $value

Il resto dello script non fa altro che confrontare ogni valore letto con la soglia d’allarme che in questo esempio è impostata sul 75% e nel caso in cui sia maggiore spedisce una mail a chi di dovere.

A questo punto non ci resta che schedulare questo script, che chiameremo check_disco.sh e a cui daremo i permessi di esecuzione, con il mitico crontab a seconda delle nostre esigenze.

Se per esempio abbiamo paura che il disco si possa riempire repentinamente, magari a causa di qualche software che in caso di errore produce grossi dump a rate elevati (Java VM anyone?), possiamo pensare di schedularlo in modo che giri ogni ora con la seguente riga di crontab:

0 * * * * /usr/bin/check_disco.sh &> /var/log/check_disco.log

Da notare come la riga 3 dello script (set -x) in combo con la redirezione degli stream di output su check_disco.log ci darà la possibilità di valutare l’ultima esecuzione dello script, nel caso in cui le cose non siano andate come ci aspettavamo.

Come nota finale aggiungo che se non riuscite a mandare le mail attraverso il comando mail, potreste provare a creare un file .mailrc nella directory home dell’utente su cui è stata schedulata l’esecuzione dello script, in cui specificare l’indirizzo del vostro server SMTP nel modo seguente:

set smtp=X.X.X.X

Come organizzare i file multimediali nella propria web application

Nel contesto in cui dovessimo sviluppare una web application che utilizzi un database come MySQL dovremmo decidere come organizzare i file multimediali.

La domanda cioè che potremmo porci sarebbe più o meno la seguente:

Immagini, PDF, filmati e file audio dove li metto, nel database sottoforma di BLOB o li tengo su filesystem?

Come sempre, entrambe le soluzioni hanno pregi e difetti che elencherò a breve; conoscerli equivale a prendere la decisione giusta in base al contesto in cui ci troviamo.

File multimediali nel database come BLOB

Pregi

  • il loro backup è facilitato in quanto è incluso nel backup del database;
  • non è necessario organizzarli né dare loro un nome;
  • sono direttamente collegati ai dati dell’applicazione;

Difetti

  • andranno ad occupare spazio su database e in genere questo è sconveniente dal momento che i servizi di hosting tendono a far pagare lo spazio occupato dal database piuttosto che lo spazio web, in genere illimitato anche nei pacchetti più economici;
  • il database tratta immagini, PDF, filmati e file audio allo stesso modo, cioè come larghi oggetti binari, BLOB appunto e quindi, a meno di software apposito, non avremo nessun tipo di supporto da parte del database per vedere e manipolare questi contenuti;
  • ad un certo punto questi file andranno probabilmente letti dal database per poter essere mostrati all’utente impedendo al web server di attuare alcuna forma di caching verso il client. Questo aumenterà banda e tempi di caricamento anche per immagini immutate;

File multimediali su filesystem

Pregi

  • non occupano spazio su database e quindi risultano più economici per i servizi di hosting a pagamento;
  • il filesystem dei moderni S.O. abbinato al FileManager e a un lettore multimediale offrono un supporto di base ai vari formati multimediali (anteprima, visualizzazione, ricerca), per di più ne consentono un’organizzazione gerarchica e una gestione di massa attraverso console e tools a riga di comando (es. ridimensionare tutte le immagini alla tal dimensione utilizzando mogrify di ImageMagick);
  • il web server è in grado di attuare del caching diminuendo la banda occupata e velocizzando il processo di caricamento delle pagine da parte degli utenti;

Difetti

  • rispetto ai dati contenuti nel database, ne va fatto un backup a parte;
  • va decisa un’organizzazione in cartelle e va scelta una policy per i nomi;
  • non sono immediatamente collegati al resto dei dati: andrà scritto del codice per collegare i record ai file attraverso la policy scelta per organizzarli e nominarli;

In definitiva a meno che non abbiate necessità particolari di backup o mirroring dei contenuti multimediali quasi sempre sarà più conveniente tenerli su filesystem.