Domanda

Attualmente sto usando questo processo per disinfettare / filtrare i commenti inseriti dagli utenti - >
Questo è usato per rimuovere le barre ... e

 if (get_magic_quotes_gpc()) {
        function stripslashes_deep($value)
        {
            $value = is_array($value) ?
                        array_map('stripslashes_deep', $value) :
                        stripslashes($value);

            return $value;
        }

        $_POST = array_map('stripslashes_deep', $_POST);
        $_GET = array_map('stripslashes_deep', $_GET);
        $_COOKIE = array_map('stripslashes_deep', $_COOKIE);
        $_REQUEST = array_map('stripslashes_deep', $_REQUEST);
    }

Quindi il commento passa attraverso questa funzione per disinfettare i dati ...

   function my_strip_tags($str) {
                $strs=explode('<',$str);
                $res=$strs[0];
                for($i=1;$i<count($strs);$i++)
                {
                    if(!strpos($strs[$i],'>'))
                        $res = $res.'&lt;'.$strs[$i];
                    else
                        $res = $res.'<'.$strs[$i];
                }
             return strip_tags($res);   
    }

Dopodiché entra direttamente nel database usando l'istruzione preparata ..

function add_comment($comment,$type,$update_id,$user_id){
            $query="INSERT INTO comment_updates (updateid,userid,comment) VALUES(?,?,?)";
                if($stmt=$this->conn->prepare($query)) {
                $stmt->bind_param('sss',$update_id,$user_id,$comment);
                $stmt->execute();
                    if($this->conn->affected_rows==1){
                    $stmt->close();
                    return true;
                    }
            }
        }

Volevo solo sapere se questo è abbastanza sicuro o se ci sono altre alternative migliori ... Grazie

È stato utile?

Soluzione

Non scrivere il tuo disinfettante HTML. Creerai buchi XSS.

Se hai intenzione di scrivere il tuo, almeno esegui i ha.ckers.org xss smoketests contro di essa

Tra questi test e il confronto htmlpurifier dei filtri , dovresti essere in grado di avere una buona idea di quanto sia complicata la sanitizzazione html - e perché dovresti lasciarla ai professionisti.

Altri suggerimenti

La cosa più importante quando si pensa di archiviare i dati in un database è evitarlo; utilizzando mysql_real_escape_string o mysqli_real_escape_string o PDO::quote , a seconda del DB che stai usando (o altre funzioni per Oracle / pg / ...)

Un'altra soluzione sarebbe quella di utilizzare le istruzioni preparate (vedi mysqli::prepare e / o PDO::prepare - quelli non sono supportati dal vecchia mysql_* estensione), che si occuperà della fuga dei dati al tuo posto ;-)


Quando pensi all'output HTML, hai due soluzioni:

  • accetta HTML e usa alcune librerie come HTMLPurifier per filtrarlo / pulirlo; consentirà di specificare esattamente quali tag e attributi sono ammessi e fornirà HTML pulito e valido come output.
  • prova a rimuovere l'HTML, come stai facendo - non funziona sempre bene (cosa succede se dimentichi un caso speciale?)
  • escape HTML, con htmlentities o htmlspecialchars : non necessariamente bello, ma l'output sarà simile all'input dell'utente.

Vorrei andare con la prima o l'ultima soluzione; il tuo si sente più " pericoloso " - ma è solo un sentimento ^^ (l'idea generale è " non reinventare la ruota ")

La gestione delle virgolette magiche va bene, anche se se crei i parametri get con le virgolette devi anche barrare le chiavi. :)

Per quanto riguarda i tag strip, stai meglio con una vera libreria di filtri HTML. Ci sono così tanti colpi di scena coinvolti con html che non dovresti fidarti di tutto ciò che fai una volta e di cui ti dimentichi. Le persone passano il tempo a creare quei filtri HTML, quindi usa il loro lavoro a tuo vantaggio.

Per quanto riguarda " direttamente nel DB " ;, bene in un parametro associato, certo, è fantastico. Puoi tranquillamente inserire qualsiasi cosa in un parametro associato. In una stringa con virgolette, spero che stai sfuggendo al risultato.

Esci da tutti i caratteri quando lo metti nel database. Quando recuperi e visualizzi assicurati di sfuggire alla formattazione html come <sometag> in modo che venga visualizzata anziché essere trattata come codice.

PHP ha funzioni igieniche integrate poco conosciute ma potenti. Consiglierei di usarli:

Filtro di input in PHP

filter_input e filter_var

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