HTML Sanitization
Ho letto con interesse l’ultimo post di Jeff aka CodingHorror riguardo la “disinfettazione” dell’HTML. L’articolo vale la pena di essere letto ed i link valgono la pena di essere visitati.
Jeff conclude il post con una affermazione buona e giusta ripresa da Joel Spolsky: “If it's a core business function -- do it yourself, no matter what.”
Affermazione sulla quale concordo ma che secondo me mal si applica al caso specifico del nuovo sito di Jeff (www.stackoverflow.com). Nei piccoli esperimenti con Blogoo mi sono reso conto che il problema della disinfettazione è molto interessante ma che sbagliare è molto facile. A parte poi il fatto che l’unico core business che dovrebbe essere interessato all’implementazione delle specifiche HTML dovrebbe essere quello del browser. L’HTML se si considerano tutte le forme di canonicalizzazione, è troppo complicato per essere ridotto a qualche libreria di RegEx.
La mia soluzione è stata di accedere a materiale già disponibile per minimizzare il rischio e il lavoro. Ho guardato a come il meccanismo è stato implementato in altre piattaforme open source & liberal:
- BlogEngine ha scelto la strada di BBQuote. È la via più sicura, ma anche la più scomoda in vista del fatto che ho sempre desiderato mettere a disposizione un editor HTML come TinyMCE.
- DasBlog e SubText hanno scelto la strada di supportare un subset di tag HTML usando regular expression come strumento per il riconoscimento dei tag. Non è la soluzione ideale – e ad occhio il codice di SubText sembra migliore – ma buona abbastanza.
Io ho scelto il codice di DasBlog solo per motivi “storici”.
La soluzione di Jeff, simile a quelle di DasBlog/SubText è stata pubblicata su Refactor :my => ‘code’. Il post è stato letteralmente preso d’assalto ed uno dei suggerimenti a firma di Jon Galloway suggerisce l’uso di una libreria pubblica chiamata Html Agility Pack. Bingo!
Ho sperimentato l’Html Agility Pack per sistemare il contenuto di una migrazione da Live Spaces ed è fantastica. Non so se abbia senso per fare Html Sanitization, ma uno dei codici di esempio forniti in allegato si occupa di convertire HTML in testo (rimuovendone tutti i tag) cosa che risulterebbe più accurata dell’attuale pezzo di codice basato ancora una volta su RegEx. Unica perplessità la licenza basata su Creative Commons Attribution-ShareAlike. Qualcuno ci ha scherzato su:
I think the current licensing agreement says that if you perform an interpretive dance about HtmlAgilityPack, then you would have to display the URL somewhere on the stage.
ma il dubbio rimane. Qualche avvocato lì fuori può chiarire cosa significa CC-BY-SA applicato al software?
-quack