Domanda

Attualmente sto lavorando a un'applicazione che richiede agli utenti di inviare post e commenti visualizzati sul sito. Come tutti sappiamo che l'input dell'utente non può essere attendibile, quindi ho usato htmlspecialchars ($ string, ENT_QUOTES) per elaborare i post e i commenti degli utenti.

Ora, voglio che alcuni tag html vengano ignorati. come <b><br /> e qualche altro tag. Come posso farlo in modo che htmlspecialchars ignori alcuni tag mentre filtra gli altri.

È stato utile?

Soluzione

soluzione a)
usa strip_tags insted di htmlspecialchars e inserisci nella whitelist i tag necessari.
soluzione migliore b)
Utilizzare bbcodes e fornire alias ai tag desiderati, ad esempio: [b] bold [/ b]

Altri suggerimenti

È molto, molto difficile consentire solo alcuni tag HTML senza consentire alcuna possibilità di iniezione di script o simili.

In realtà consiglierei di evitarlo e di usare qualcosa che generi HTML come questo codice UBB parser (o simile). O anche Markdown (con l'opzione HTML disattivata).

Ciò non consente agli aggressori di colpire il tuo sito, il che è molto importante se è rivolto al pubblico.

Se permetti anche un po 'di HTML, è probabile che un determinato attaccante troverà un modo per aggirarlo.

Stanco di usare BBCode a causa dell'attuale panorama di filtri HTML carenti o non sicuri?
- > Purificatore HTML

HTML Purifier è una libreria di filtri HTML conforme agli standard scritta in PHP. HTML Purifier non solo rimuoverà tutto il codice dannoso (meglio noto come XSS) con una whitelist completamente controllata, sicura ma permissiva, ...

È possibile sostituire la stringa tra virgolette per reinserire i tag consentiti. Ad esempio per <b> tag:

$string = str_replace(array('&lt;b&gt;', &lt;/&gt;), array('<b>', '</b>'), $string);

Consentirei solo che tag molto distinti e completi siano il più sicuri possibile. Cioè Non usare espressioni regolari se non è necessario, può portare a bug molto cattivi.

Consiglio vivamente di utilizzare Zend_Filter per filtrare l'input dell'utente. In particolare, vedi: http://framework.zend.com/ manuale / it / zend.filter.html # zend.filter.introduction.using

Questo non è così semplice come si potrebbe pensare perché né htmlspecialchars() htmlentities() fornisce alcuna opzione per ignorare determinate tag (entrambe le funzioni non conoscono nemmeno il significato della nozione di tag ).

Potresti utilizzare altri mezzi per consentire agli utenti di formattare i loro post, ad es. BBCode , Textile o Markdown . Ci sono parser PHP disponibili per tutti loro.

Se dovrete attenervi ai tag html, potreste ricorrere a una preelaborazione che riformatta i tag consentiti in modo che non siano interessati da <a> . È quindi possibile postelaborare il risultato per ripristinare il formato in normali tag HTML. L'esempio seguente visualizza questo processo per un semplice tag <=> -. Tieni presente che l'elaborazione di HTML con espressioni regolari è soggetta a errori e non è sempre la strada da percorrere: in questo esempio lo userò solo per motivi di semplicità.

$input = preg_replace('~<(/?\w+([^>]*?))>~', '|#$1#|', $input);
$input = htmlspecialchars($input);
$inoput = preg_replace('~|#(/?\w+(.*?))#|~', '<$1>', $input);

Questo non è testato e richiederà sicuramente molto più lavoro.

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