Visualizzazione risultati 1 fino 2 di 2

Discussione: classe DOMDocument non funziona su altervista

  1. #1
    Guest

    Smile [RISOLTO] classe DOMDocument non funziona su altervista

    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();
    }
    }
    ?>
    Ultima modifica di newbielinux : 03-10-2016 alle ore 01.08.48

  2. #2
    Guest

    Predefinito

    Trovato l'errore.
    Eliminavo tutti i tag <html> ecc. e il DOCTYPE che invece devo ovviamente lasciare.
    In pratica, basta eliminare LIBXML_HTML_NOIMPLIED | LIBXML_HTML_NODEFDTD e tutto è ok.

    Grazie comunque.
    Ciao.

Tags for this Thread

Regole di scrittura

  • Non puoi creare nuove discussioni
  • Non puoi rispondere ai messaggi
  • Non puoi inserire allegati.
  • Non puoi modificare i tuoi messaggi
  •