htmlentities è sufficiente per proteggere il tuo sito e i tuoi visitatori a condizione che tu non faccia nulla di esplicitamente ignorante nel processo. Ad esempio, supponiamo che tu abbia emesso il messaggio in questo modo:
<div class="post"><?php echo htmlentities($myVar, ENT_QUOTES); ?></div> ...
Poiché tutto è sfuggito, starai bene, anche se PHP o JavaScript sono in $ myVar. Tuttavia, questo non si applica se decidi di fare qualcosa del genere:
<script><?php echo htmlentities($myVar, ENT_QUOTES); ?></script>
Perché questa è una modalità valida per la codifica di JavaScript, e comporterebbe l'esecuzione dello script. Allo stesso modo, PHP non viene eseguito di solito solo perché viene eseguito in fughe di PHP all'interno di una stringa, quindi htmlentities non causa alcun danno, a meno che non decidiate di:
<?php eval($myVar); ?>
Prevenire XSS non significa solo sfuggire all'output, ma sapere conoscere quando per uscire dall'output e in quali contesti potrebbe essere pericoloso. Non dovresti mai emettere input dell'utente all'interno di uno script, uno stile, un tag di base o di link e dovresti sempre disinfettare l'input dell'utente prima di inserirlo nel body o head tag o uno dei suoi figli, e specialmente negli attributi , che è comune quando si pre-popolano i moduli (ad esempio in modo che possano correggere l'input non valido).
Anche il sito a cui sei collegato contiene sostanzialmente quello che ho appena detto, ma meno dettagliato:
HTML entity encoding is okay for untrusted data that you put in the body of the HTML document, such as inside a tag. It even sort of works for untrusted data that goes into attributes, particularly if you're religious about using quotes around your attributes. But HTML entity encoding doesn't work if you're putting untrusted data inside a tag anywhere, or an event handler attribute like onmouseover, or inside CSS, or in a URL. So even if you use an HTML entity encoding method everywhere, you are still most likely vulnerable to XSS. You MUST use the escape syntax for the part of the HTML document you're putting untrusted data into. That's what the rules below are all about.