Salve,
Studiando la classe DOMDocument() che altervista supporta nativamente, come ho controllato con phpinfo(); ho creato una classe che usa appunto la DOMDocument() per evitare attacchi XSS alle input di un form, evitando così che si possa inserire codice malevolo in js, ecc.., colmando perciò le lacune delle predefinita strip_tags() e similari.
L'uso delle REGEX infatti è pure sconsigliato, perché è impossibile prevedere tutti i vari input di un utente "burlone", mentre usando il DOM si risolve benissimo il problema.
Purtroppo questa mia classe NON funziona affatto qui.
In locale invece tutto è ok.
Metto qui sotto la classe con i vari es. di utilizzo che ho creato, prendendo esempio dal codice di altri utenti sul manuale online del PHP.
Idee?????
Grazie e ciao.
Codice PHP:
<?php
/**
* Created by Jam1 on October 2, 2016.
*
*
* Example of how to use the class:
*
* $html_str = 'matt';
* $html_str = '<p>matt</p>';
* $html_str = '<script>alert("Hi")</script>';
*
* $st = new StripUnwantedTagsAndAttrs;
* echo $st->strip($html_str);
*
* If $html_str is 'matt' or '<p>matt</p>' it prints matt, while
* if $html_str is '<script>alert("Hi")</script>' nothing is printed,
* that's, the string is correctly cleared.
*
*
* Another example:
*
* if ( $st->strip($html_str) === FALSE )
* echo 'FAILURE!';
* else
* echo 'All good';
*/
class StripUnwantedTagsAndAttrs
{
private $allowed_tags;
private $allowed_attrs;
public function strip($html_str)
{
$xml = new DOMDocument();
// Suppress warnings: proper error handling is beyond scope of example
libxml_use_internal_errors(true);
/**
* List the tags you want to allow here,
* NOTE you MUST allow html and body
* otherwise entire string will be cleared
*/
$this->allowed_tags = array("html", "body", "b", "br", "em",
"hr", "i", "li", "ol", "p", "s",
"span", "table", "tr", "td", "u",
"ul");
/**
* List the attributes you want to allow here
*/
$this->allowed_attrs = array ("class", "id", "style");
/**
* here LIBXML_HTML_NOIMPLIED
* sets HTML_PARSE_NOIMPLIED flag, which turns off the automatic adding
* of implied html/body... elements.
* and LIBXML_HTML_NODEFDTD
* sets HTML_PARSE_NODEFDTD flag, which prevents a default doctype being added
* when one is not found.
*/
if ( $xml->loadHTML($html_str, LIBXML_HTML_NOIMPLIED | LIBXML_HTML_NODEFDTD ) )
{
foreach ( $xml->getElementsByTagName("*") as $tag )
{
if ( ! in_array($tag->tagName, $this->allowed_tags) )
{
$tag->parentNode->removeChild($tag);
return FALSE;
}
else
{
foreach ( $tag->attributes as $attr )
{
if ( ! in_array($attr->nodeName, $this->allowed_attrs) )
{
$tag->removeAttribute($attr->nodeName);
}
}
}
}
}
return $xml->saveHTML();
}
}
?>