Site icon Ryadel

PHP - Come estrarre il contenuto XML da un file XML.P7M (CAdES, Fattura PA)

php-cgi.exe - The FastCGI process exited unexpectedly error and how to fix it

Qualche giorno fa mi è stato chiesto di preparare un paio di pagine PHP per estrarre il contenuto di una serie di file XML relativi a fatture elettroniche per la Pubblica Amministrazione, realizzati cioè seguendo il formato definito dall'Agenzia delle Entrate e noto con il nome di Fattura PA. Si trattava di un lavoro semplice, nel corso del quale mi sono trovato a dover risolvere molto rapidamente - per ragioni legate ai tempi di consegna - due problemi non banali: estrarre il contenuto XML da una serie di file .xml.p7m firmati digitalmente ed eliminare dal contenuto i caratteri non UTF8 nel contenuto XML.

Dovendo concludere lo sviluppo rapidamente ho deciso di risolvere entrambe le problematiche allineandomi a uno dei più famosi luoghi comuni che, non senza un fondo di verità, accompagnano da sempre le caratteristiche del linguaggio PHP: il fatto che si tratti di un "double clawed hammer", ovvero di un martello a due penne (e nessuna testa). In questo articolo ci occuperemo del primo argomento, rimandando il secondo a tempi migliori (UPDATE: alla fine l'ho scritto! Se vi interessa leggerlo, fate click qui).

PHP - Come estrarre il contenuto XML da un file XML.P7M (CAdES, Fattura PA)
Immagine di un lavoro originale realizzato da Ian Baker. Altre foto di questa meravigliosa opera sono disponibili sulla sua pagina Flickr: https://www.flickr.com/photos/raindrift/sets/72157629492908038

Per quanto riguarda l'estrazione XML dal P7M ho approfittato del fatto che tutte le fatture erano state firmate digitalmente utilizzando il formato CAdES, il quale - come forse già sapete - prevede l'aggiunta al file originale di un header PKCS#7 in testa e di una signature info in coda, lasciando il contenuto in mezzo intalterato. Questo consente di rimuovere entrambi, a patto di riuscire a localizzare l'esatta posizione del contenuto che si desidera preservare. Nel caso di un file XML questo è fortunatamente piuttosto semplice. E' importante sottolineare come procedere in questo modo non ci dà nessuna garanzia sulla bontà della firma digitale stessa, che viene scartata senza alcuna verifica. Nel caso specifico, trattandosi di documenti già verificati alla fonte e archiviati digitalmente a monte del mio visualizzatore, io ho potuto farne a meno senza problemi. Al tempo stesso, suggerisco di prestare la massima attenzione al proprio ambito di uso: se avete bisogno di verificare l'autore del file è senz'altro opportuno utilizzare un metodo diverso che tenga in considerazione la firma del mittente.

Tutto ciò premesso, ecco il codice che ho utilizzato:

Non c'è molto da spiegare: ho semplicemente utilizzato una combinazione di alcune funzioni di string lookup / string manipulation fornite da PHP - strpos, substr, preg_match_all - per localizzare i tag XML all'inizio e alla fine del documento, eliminando tutto il contenuto che viene prima o dopo di loro.

Lo scenario applicativo più comune di una funzione di questo tipo è in conseguenza della ricezione di una REQUEST POST in formato multipart contenente un file XML.P7M come parametro:

... e così via.

Si tratta di un metodo estremamente inappropriato per elaborare un file di questo tipo, ma non avendo la possibilità di controllare la firma è l'unico modo che mi è venuto in mente per risolvere rapidamente il problema.

Utilizzatelo tenendo presente le raccomandazioni di cui sopra, e... felice sviluppo!

Riferimenti utili

Exit mobile version