Visualizzazione risultati 1 fino 12 di 12

Discussione: Filtraggio stringhe e caratteri html!

  1. #1
    makingweb non è connesso Utente attivo
    Data registrazione
    30-06-2009
    Messaggi
    281

    Predefinito Filtraggio stringhe e caratteri html!

    Buona sera, qualcuno mi sa spiegare perchè quando se passo questo testo
    Ciao io sono un testo html <$&
    in queste funzioni
    Codice PHP:
    $val = nl2br(preg_replace('/\n{2,}/', "\n", strip_tags(trim($val))));
    ricevo:
    Ciao io sono un testo html
    all'inizio del file php ho specificato
    Codice PHP:
    header('Content-Type: application/json; charset=UTF-8');

  2. #2
    karl94 non è connesso Staff AV
    Data registrazione
    03-10-2005
    Messaggi
    17,744

    Predefinito

    Beh, usi la funzione strip-tags che identifica dal simbolo minore fino alla fine della stringa un tag (anche se non lo è nemmeno lontanamente) e di conseguenza lo rimuove. Come invece vorresti che si comportasse?

  3. #3
    makingweb non è connesso Utente attivo
    Data registrazione
    30-06-2009
    Messaggi
    281

    Predefinito

    Citazione Originalmente inviato da karl94 Visualizza messaggio
    Beh, usi la funzione strip-tags che identifica dal simbolo minore fino alla fine della stringa un tag (anche se non lo è nemmeno lontanamente) e di conseguenza lo rimuove. Come invece vorresti che si comportasse?
    in realtà mi elimina anche i simboli come & oppure <3 e probabilmente anche altri.

    Comunque, vorrei che potessero rimanere.
    Questi simboli sono molto utilizzati, come possa fare in modo che strip_tags non li elimini?

  4. #4
    karl94 non è connesso Staff AV
    Data registrazione
    03-10-2005
    Messaggi
    17,744

    Predefinito

    Beh, anziché eliminare i tag, puoi trasformare i caratteri speciali HTML in entità, in modo tale che siano visualizzabili come testo ma non possano alterare in modo alcuno la struttura del tuo documento HTML (e in conseguenza la sicurezza del tuo sito).
    Se indichi in che contesto viene utilizzato il tutto ti si potrà suggerire la soluzione più adatta.

    Hmm, rileggendo il primo tuo messaggio ho trovato JSON, dovresti proprio spiegare che dati passano, cos'è $val, perché a seconda dell'implementazione potrebbe esserci qualche potenziale falla.
    Ultima modifica di karl94 : 03-05-2012 alle ore 22.38.03

  5. #5
    makingweb non è connesso Utente attivo
    Data registrazione
    30-06-2009
    Messaggi
    281

    Predefinito

    ho risolto come suggerito da te, cioè inserendo htmlentities.
    Il problema per i simboli tipo & era dato dal fatto che inviassi i dati come stringa e non come oggetto.

  6. #6
    karl94 non è connesso Staff AV
    Data registrazione
    03-10-2005
    Messaggi
    17,744

    Predefinito

    Ripeto:
    Citazione Originalmente inviato da karl94 Visualizza messaggio
    Dovresti proprio spiegare che dati passano, cos'è $val, perché a seconda dell'implementazione potrebbe esserci qualche potenziale falla.
    A seconda di come sono le cose ci potrebbero essere problemi di sicurezza, come l'iniezione di codice malevolo.

  7. #7
    makingweb non è connesso Utente attivo
    Data registrazione
    30-06-2009
    Messaggi
    281

    Predefinito

    La stringa $val rappresenta il testo di un commento, che gli utenti possono scrivere.
    Ecco la mia stringa, ma strip_tags in questo caso, diventa inutile?
    Codice PHP:
    $val = nl2br(preg_replace('/\n{2,}/', "\n", strip_tags(htmlentities(trim($val)))));

  8. #8
    karl94 non è connesso Staff AV
    Data registrazione
    03-10-2005
    Messaggi
    17,744

    Predefinito

    Ma quindi $val viene direttamente dall'esterno? Poi che fine fa?
    Comunque sì, così strip_tags appesantisce e basta, e comunque io userei htmlspecialchars anziché htmlentities.
    Ultima modifica di karl94 : 04-05-2012 alle ore 20.10.36

  9. #9
    makingweb non è connesso Utente attivo
    Data registrazione
    30-06-2009
    Messaggi
    281

    Predefinito

    Ora ti spiego tutto per bene.

    Io una pagina dove gli utenti registrati possono lasciare un commento.
    Gli utenti scrivono il commento, poi tramite jqeury faccio una richiesta di questo genere a una pagina php

    Codice PHP:
    $.ajax({
    type: "POST",
    url: "ajax/commenta.php",
    data: {testo: testo, id : elemento_id },
    dataType: "json",
    success: function(r) {
    alert('Commento inserito');
    }
    });
    ora in nella pagina php io ricevo $_POST['testo'], che viene ridefinita come $val e $_POST['elemento_id'] che ridifenisco e filtro in questo modo:

    Codice PHP:
    //TESTO DEL COMMENTO
    $val = nl2br(preg_replace('/\n{2,}/', "\n", htmlspecialchars(trim($_POST['testo']))));
    //ID DELL'ELEMENTO COMMENTATO
    $id = is_numeric($_POST['elemento_id']) ? $_POST['elemento_id'] : false;

    //altri controlli...e poi query che inserisce il tutto
    dopo di che, faccio altri controlli e salvo tutto in una tabella mysql con collation utf8_unicode_ci.

    Secondo te è giusto? C'è qualche falla?

  10. #10
    karl94 non è connesso Staff AV
    Data registrazione
    03-10-2005
    Messaggi
    17,744

    Predefinito

    Le porzioni di codice che hai pubblicato sono a posto, l'altro punto critico è come fai la query: se componi la stringa di tuo pungo (concatenando le varie cose) e non usi altre funzioni, potrebbe esserci il rischio di una vulnerabilità di tipo SQL injection, in quanto htmlspecialchars se non gli passi i dovuti parametri non trasforma i singoli apici in entità e questo potrebbe essere un problema se nella query quando vai ad inserire il commento usi la sintassi con i singoli apici.
    Comunque hai valutato bene se è meglio fare l'escape durante l'immissione dei dati nel database o dopo averli riottenuti e prima di inviare il tutto al client?

    Così com'è ora hai come vantaggi le prestazioni: i commenti vengono analizzati una singola volta all'invio ed inseriti nel database pronti per venire inclusi nella pagina senza altri controlli, al contempo però la trasformazione di un carattere speciale in entità occupa qualche byte in più.
    Gli svantaggi sono la flessibilità: stai progettando questo con l'obbiettivo di usare solo l'HTML come mezzo, se dovessi magari in futuro includere un sistema per caricare i commenti, che so, in una applicazione esterna che non ha nulla a che fare con l'HTML o, più semplicemente, mandare una notifica testuale per email dovresti ritrasformare il testo.

  11. #11
    makingweb non è connesso Utente attivo
    Data registrazione
    30-06-2009
    Messaggi
    281

    Predefinito

    La query l'ho sempre scritta io concatenando tutto manualmente ( esistono altri metodi? ) e utilizzando il real escape di mysqli, così
    Codice PHP:
    $mysqli->query("INSERT INTO commenti (ele_id, user, testo, time) VALUES ( $ele_id, '{$_SESSION['user']}', '".$mysqli->real_escape_string($testo)."', $time)") or die($mysqli->error);
    Per ora credo di voler salvare le entità html, anche perchè non dispongo di server con prestazioni elevate e prevedo un elevato traffico sul sito.

  12. #12
    karl94 non è connesso Staff AV
    Data registrazione
    03-10-2005
    Messaggi
    17,744

    Predefinito

    Citazione Originalmente inviato da makingweb Visualizza messaggio
    La query l'ho sempre scritta io concatenando tutto manualmente e utilizzando il real escape di mysqli, così
    Codice PHP:
    $mysqli->query("INSERT INTO commenti (ele_id, user, testo, time) VALUES ( $ele_id, '{$_SESSION['user']}', '".$mysqli->real_escape_string($testo)."', $time)") or die($mysqli->error);
    Allora non dovrebbero esserci problemi.

    Citazione Originalmente inviato da makingweb Visualizza messaggio
    esistono altri metodi?
    Certo, per esempio la stessa classe mysqli_stmt che fa parte della stessa estensione che usi tu, dai uno sguardo all'esempio che trovi nella pagina di documentazione relativa al metodo prepare.

Regole di scrittura

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