Pagina 1 di 2 1 2 ultimoultimo
Visualizzazione dei risultati da 1 a 10 su 16

Discussione: filter_var

  1. #1
    Utente di HTML.it L'avatar di leaf
    Registrato dal
    Oct 2012
    Messaggi
    316

    filter_var

    ciao..ho bisogno di una conferma su quello che sto facendo..
    ogni dato (i nquesto caso stringa) che viene inserito da un utente, prima di essere inserito nel database passa in mezzo a queste 2 funzioni

    codice:
    function safe_string($con, $str){
        $new_str = safe_mres($con, (filter_var($str, FILTER_SANITIZE_STRING, FILTER_FLAG_NO_ENCODE_QUOTES)));
        return $new_str;
    }
    
    
    function safe_mres($con, $value){
       return mysqli_real_escape_string($con, $value);
    }


    volevo innanzitutto avere conferma che sto facendo le cose correttamente e poi chiedere (visto che ora non lo sto facendo) se sia necessario controllare che il valore non sia vuoto (lato server). al momento il form è già pieno di controlli javascript per verificare che i campi siano compilati ecc, ma via php non sto controllando se siano vuoti..in questo caso se qualcuno riuscisse a bypassare il js, comunque l'unico problema che posso avere è una tupla vuota nel database?

    grazie
    L.

  2. #2
    Moderatore di PHP L'avatar di Alhazred
    Registrato dal
    Oct 2003
    Messaggi
    12,469
    A bypassare JS non ci vuole nulla, basta disabilitarlo dal browser. JS serve solo a rendere la navigazione più comoda agli utenti onesti, sulla sicurezza non ha alcuna influenza.

    Tutti i controlli vanno ripetuti lato server in PHP.

  3. #3
    Utente di HTML.it L'avatar di leaf
    Registrato dal
    Oct 2012
    Messaggi
    316
    ok grazie ..comunque mi confermi che il peggio che mi può succedere per ora sia che qualcuno mette tuple vuote nel db?

  4. #4
    Utente di HTML.it L'avatar di .Kurt
    Registrato dal
    Jul 2007
    Messaggi
    654
    comunque mi confermi che il peggio che mi può succedere per ora sia che qualcuno mette tuple vuote nel db?
    Bhè, una stringa vuota può benissimo essere un dato valido da mettere nel database. Non un male da cui proteggersi. Sicuramente se volessi salvare il nickname di un utente, allora voglio evitare che se lo scelgano vuoto. Anzi, per dirla tutta vorrei che potessero scegliere un nickname che abbia una lunghezza compresa tra X caratteri e Y caratteri. Vorrei anche assicurarmi che la stringa inviata sia anche ben formata (valida nel charset che ho scelto di utilizzare) e che non contenga caratteri invisibili. Farei anche altri tipi di controllo.
    Insomma, la risposta è: dipende da quello che voglio fare. Potrei anche volerli i campi vuoti, come non volerli. Esattamente come a volte vorrei salvare i dati solo dopo che sono passati con filter_var e a volte no.

    Se è la sicurezza che ti preoccupa: tutto ciò di cui hai bisogno è la funzione safe_mres. Il resto è solo validare e filtrare i dati.

    Comunque, anche se ancora non lo hai chiesto, è questione di tempo prima che tu arrivi all'argomento "prepared statements", quindi mi prendo la libertà di indicartelo io: http://stackoverflow.com/questions/6...jection-in-php

  5. #5
    Utente di HTML.it L'avatar di leaf
    Registrato dal
    Oct 2012
    Messaggi
    316
    @.kurt sei la mia luce nell'oscurità del php lo sai vero?
    comunque pdo l'avevo già guardato..ma per ora ho lasciato stare visto che essendo ad oggetti mi richiederebbe più tempo per impararlo..comunque ce l'ho già segnato come una delle cose da studiare in futuro!
    grazie
    L.

  6. #6
    Il tuo codice, nel contesto in cui l'hai esposto, è corretto.

    Tuttavia occorre precisare una cosa: ogni parte del tuo progetto deve essere corretto, e deve esserlo anche al di fuori del contesto in cui lo stai analizzando, nei limiti del possibile.

    perché se da qualche parte hai:

    codice:
    mysql_query("insert into user ('login','pass') values('$login', '$pass')" );
    questo codice non lo è. E non lo è a prescindere se $login e $pass li filtri o li controlli da qualche altra parte prima. Non lo è e basta.

    Se invece hai questo:

    codice:
    mysql_query("insert into user ('login','pass') values('".myFilter($login)."', '".myFilter($pass)."')" );
    Hai altri tipi di problemi. Sebbene potrebbe valutarsi come corretto (una volta assicuratosi che la funzione myFilter funzioni a dovere) è ancora migliorabile. Perché è un approccio che ti predispone ad errori. Questo non è un caso da sottovalutare. Sebbene credi ci sia una possibilità su un diecimila che possa accadere di dimenticarti di usare myFilter, prendi atto che nella tua vita scriverai più di diecimila query. E comunque le probabilità che ciò accada non sono così basse .

    Inoltre c'è ancora una falla. Tu dici "ogni dato che viene inserito da un utente, prima di essere inserito nel database passa in mezzo a queste 2 funzioni". Ma le query possono anche usare parametri non direttamente presi dall'utente. Immagina, per esempio, la tua tabella utenti. Immagina che ogni utente abbia inserito la città. E immagina che nel tuo sito vuoi far vedere tutti gli utenti che abitano nella stessa città dell'utente loggato.


    codice:
    $id = $_SESSION['user_id'];
    $res = mysql_query("select citta from user where id = $id");
    $row = mysql_fetch_assoc($res);
    $citta = $row['citta'];
    
    $res = mysql_query("select * from user where citta = '$citta'");
    
    // while ecc. ecc.
    In questo caso banale, dai per buono un dato inserito da un utente precedentemente. Che è male.

    Io posso aver inserito come città:

    codice:
    Milano' UNION SELECT * from tabella_sensibile
    Il tuo flusso ti funziona correttamente durante l'insert, ma non quando fai girare la mia sporcizia in giro per il database e nelle select.
    E guarda che questa falla si scopre in un lampo. Basta accorgersi che gli utenti che abitano a L'Aquila rompono delle pagine, e il resto vien da se.

    In definitiva. NO.
    Il peggio che può accaderti non sono solo stringhe vuote nel database :-)

    Il corretto approccio sarebbe quello di usare degli strumenti che ti obbligano a fare le cose per bene, e di usare i prepared statement sempre e comunque, per ogni dato. Stare a pensare ad ogni query cosa viene dall'utente e cosa no, ti predispone ad errori che sono:
    - statistici (prima o poi ti capita di perdertene uno per strada)
    - fisiologici (specifiche che cambiano. Un dato prima era statico e dopo 6 mesi lo rendi dinamico non adeguando tutto il resto del codice)

  7. #7
    Utente di HTML.it L'avatar di leaf
    Registrato dal
    Oct 2012
    Messaggi
    316
    grazie mille per le precisazioni!
    L.

  8. #8
    Tutto dipende se i campi del db li setti su Null. Altrimenti il db ti restituisce un errore perchè esige un dato da inserire.

  9. #9
    Utente di HTML.it L'avatar di leaf
    Registrato dal
    Oct 2012
    Messaggi
    316
    giusto anche questo..grazie!

    un'altra cosa (visto che rigurda sempre il filtraggio dati posto qui) a proposito di espressioni regolari..dopo aver letto un po' in giro ho scritto questa cosa per cancellare simboli strani da una stringa..è giusta? (chiedo qui perchè non sono ancora riuscito a provarla)
    mi interessa togliere questi caratteri |;:.^*+?$
    codice:
    $str = preg_replace('/[\|;:\.\^\*\+\?\$]/', '', $str);
    grazie
    L.

  10. #10
    Utente di HTML.it L'avatar di .Kurt
    Registrato dal
    Jul 2007
    Messaggi
    654
    Se ti capita di non poter testare una cosa in locale, allora usa servizi come http://sandbox.onlinephpfunctions.com/ per farlo.
    http://3v4l.org/hI7ed

    Altrimenti il db ti restituisce un errore perchè esige un dato da inserire.
    No. Nota bene: c'è una grande differenza tra una stringa vuota e il valore NULL.

    Domanda: Qual'è il mio colore preferito? -> Risposta: Rosso -> il mio colore preferito è rosso.
    Domanda: Qual'è il mio colore preferito? -> Risposta: NULL -> non lo specifico, non te lo dico, non ti dico neanche se c'è l'ho o no.
    Domanda: Qual'è il mio colore preferito? -> Risposta: "" -> non ho nessun colore preferito.
    Ultima modifica di .Kurt; 09-12-2014 a 18:35

Permessi di invio

  • Non puoi inserire discussioni
  • Non puoi inserire repliche
  • Non puoi inserire allegati
  • Non puoi modificare i tuoi messaggi
  •  
Powered by vBulletin® Version 4.2.1
Copyright © 2024 vBulletin Solutions, Inc. All rights reserved.