Pagina 3 di 8 primaprima 1 2 3 4 5 ... ultimoultimo
Visualizzazione dei risultati da 21 a 30 su 76

Discussione: Purga stringhe PHP

  1. #21
    Utente bannato
    Registrato dal
    Jul 2013
    Messaggi
    290
    Quote Originariamente inviata da badaze Visualizza il messaggio
    Ma a questo punto invece di purgare le stringhe; converti i caratteri nel loro valore numerico e salvi cosi. Poi converti di nuovo in alfanumerico prima di stampare a video. Ti costa un po' di spazio disco ma non devi più farti delle domande se rimpiazzare o meno una parola e di sicuro eviti ogni tipo di SQL injection.
    Se l'ho capito bene è l'approccio hex (o comunque con questa filosofia).
    Però poi non posso cercare agevolmente le informazioni

  2. #22
    Utente bannato
    Registrato dal
    Jul 2013
    Messaggi
    290
    Quote Originariamente inviata da Santino83_02 Visualizza il messaggio
    Se vuoi possiamo fare una discussione analoga e infinita sull'opportunità o meno di creare tabelle a) a nome dinamico e b) con nome PRESO DALL'INPUT DELL'UTENTE!! Ma stai facendo un gestionale per creare un db da interfaccia web o è una scelta (scellerata) di organizzazione dei dati? Perchè, mentre nel caso A avresti "ragione" dal momento che il nome della tabella lo devi pulire perchè pdo non lo farebbe per te, nel secondo caso è (ihmo stra-ihmo ma molto ihmo-fondato) una cosa sensa senso e inutile e pericolosa, quando ti basterebbe una fk tra due tablle invece di avere N tabelle che non servono a nulla.
    Servono, anzi sono indispensabili.
    Essenzialmente N clienti hanno N tabelle (pippo_documenti, pluto_documenti, sempronio_documenti) uguali, ma ovviamente sono diversi (i clienti), e non è che siano proprio contenti qualora "mischiassi" i dati.
    Tra l'altro renderebbe moooolto difficile, se non impossibile, backup e restore selettivo di un singolo cliente.
    Poi ogni cliente ha K viste sulle tabelle, ognuna per ogni utente.
    Quindi l'utente ugo dell cliente pippo ha una vista ugo_pippo_documenti con la quale vede solo i suoi dati, mentre l'utente rosso ha una vista rosso_pippo_documenti e così via.
    L'utente mysql che usa gli script PHP ha grant SOLO sulle viste, o meglio sulle porzioni di viste, per i singoli utenti.
    Pertando per capirci il programma PHP non può (in teoria!) vedere informazioni diverse rispetto a quelle previste, perchè il suo utente non lo può fare

    purgare i dati prima di passarli al prepared statement non ha senso, perchè il prepared statement lo fa in automatico...
    A dir la verità non lo fa minimamente, perchè non tiene conto di XSS e quindi di pezzi html, css o javascript
    ...allora te li "purghi" a mano nei modi piu disparati.
    Secondo quanto ho letto non è l'approccio migliore, perchè è insecuro per default.
    Va rovesciata la logica: non è che posti tutto quello che vuoi, e io cerco di metterci delle "pezze" a destra e a manca.
    Posti solo quello che voglio io, e il meccanismo è automatico, non puoi dimenticarlo o eluderlo (sicuro per default).
    Ppoi eventualmente in certi casi, dove è necessario, si "allarga" il cordone.


    Se poi questi valori li usi per generare nomi delle tabelle, allora guarda fai prima a far si che i il valore sia fatto solo da lettere e numeri e senza spazi, al limite gli underscore, perchè tutti gli altri caratteri non andrebbero bene.
    E' proprio quello che ho fatto
    Ma questo non è pulire il codice dell'utente per evitare sql injection (perchè lo fa pdo), ma è "VALIDARE" l'input dell'utente per garantire un corretto comportamento dell'applicativo.
    Non so come si chiami, quello che voglio impedire è SQL injection sulla creazione del nome della tabella (anzi della vista). Poi come o perchè si chiami non so, lo imparerò.
    Ad esempio, se un campo accetta solo interi, e l'utente ti passa anche delle lettere, PRIMA di passare il tutto a PDO validi l'input per essere sicuro (lato applicativo) che i dati passati rispettino la logica del sistema, e dopo li dai a PDO. Se non lo fai, l'utente può pure passarti "DROP TABLE USERS" nelle varie forme da SQL injection, ma tutto quello che otterrai sarà un'eccezione sul tipo di dati non compatibile
    Lo ripeto: uso solo statement PDO quindi questo problema non mi interessa, lo dò per risolto
    Per il resto, quel bel link che hai postato te te lo dice a chiare lettere: usa un ORM (evitando ovviamente di creare query con l'input dell'utente)
    Non so (ancora) bene cosa sia un ORM, lo studierò
    e usa template engine per stampare output.
    E' la mia funzione write, sarà un "template engine" dei poveri, ma mi accontento...
    Come vedi ho seguito pedissequamente, nel limite delle mie conoscenze, proprio i consigli
    Poi una domanda: ma una tabella non la posso chiamare "tabellaINSERTO" secondo te? no perchè la funzione che hai postato me la converte in "tabellaO" -_- Quindi non vendere il tuo programma ai giornalai
    Il nome delle tabelle le decido io, non lo decide l'utente.
    Quindi no, non si può chiamare INSERTO, o "droppa", o "altera"
    A giudicare da come hai risposto, il problema è a monte, nella struttura generale dell'applicazione. Rivedi quella, e poi pensi a come implementarla, non "penso come ad implementarla e poi la rivedo".
    Non so se la struttura è buona, a me sembra che faccia quelo che deve fare, però "trust no one" e quindi cerco di studiare il modo per migliorarla, per quanto possibile.

    Pure quello che dici, delle "whitelist", quello è validare l'input, non purgare, e poi essere sicuri che il valore scelto lato client (il browser web) sia valido anche lato server (lo script php), perchè cambiare o bypassare la parte client non ci vuole nulla, sta alla parte server garantire i dati
    Boh io lo chiamo "purgare", poi ci sarà un termine tecnico più adatto
    ah poi un'ultima considerazione di esperienza personale: salva i dati inseriti dall'utente nel modo piu "originale" possibile, perchè se tu li elabori in un modo che ora ti sembra figo, e dopo scopri che esiste un modo molto piu figo (o anche solo che cambiano le esigenze), rischi di ritrovarti con dati incompatibili.
    Francamente non ho capito cosa significhi, per me "figo" sono banali campi stringa, interi e date di mysql

    Quindi io arriverei a due conclusioni: 1) non usare quella funzione oppure spiega chiaramente in quali casi e per quale motivo ti serve, perchè impiegata su tutto "non serve a nulla" e ci sono anche soluzioni migliori a seconda dei casi, 2) rivedere l'architettura generale e capire veramente dove stanno i punti deboli e rinforzarli in maniera opportuna, piuttosto che idealizzare una "sicurezza by default" che non esiste, perchè il problema sei tu, non è ne l'utente (che poverino, digita tasti a caso sulle tastiere) nè del linguaggio che usi, ma il problema è quello che dici al linguaggio di fare. lì, nel 99,999% dei casi è il bug.[/QUOTE]

  3. #23
    Utente bannato
    Registrato dal
    Jul 2013
    Messaggi
    290
    Quote Originariamente inviata da k.b Visualizza il messaggio
    A parte il caso in cui tu ti ritrovi a scrivere un tool simile a phpmyadmin, nel 99% dei casi la necessita' di nomi dinamici delle tabelle e' un errore di progettazione.
    Ho spiegato nel post precedente perchè è fatto così, per una "difesa in profondità" usando la granularità dei diritti dell'utente mysql (altra cosa ripresa da quel sito, ovviamente)
    Supponendo comunque di trovarci nel 1% in cui sia una caratteristica legittima, la cosa si risolve con una semplicissima whitelist, perche' la regola e' sempre quella: nessun dato fornito dall'utente deve andare nella stringa che compone una query. Se ti attieni a questa regola, non avrai MAI problemi di SQL injection.
    Eh... magari... ovviamente i dati forniti dall'utente DEVONO andare a finire nella query, altrimenti il sito diventa pagine HTML e di dinamico non c'è nulla.
    Oddio per la verità potrei anche, ma si supererebbe il livello di "brutalità" che pare eccessivo perfino a me.
    Accettare una mail di quel tipo di per se' non pone nessun problema di sicurezza...
    Era un esempio di rovesciamento della filosofia: fai quello che decido io, non quello che vuoi te con me che ti "insegue" sperando in qualche modo di tappare le falle.
    Le falle non le apro
    Se fai questo l'unica cosa che ottieni e' dei dati corrotti rispetto all'originale, e' un po' come dire "visto che non voglio che mi rubino la macchina le do' fuoco cosi' risolvo il problema".
    E' più del tipo "il mio programma è come una incudine con delle sottili feritoie dove puoi mettere dentro i dati", invece di "il mio programma prende tutto da tutti"
    La cosa migliore da fare e' salvare l'input cosi' com'e', e gestirlo poi a seconda dei casi. Modificare l'input e' il peggior modo di approcciare il discorso sicurezza.
    Nel sito dice che il dato non andrebbe modificato, ma brutamente scartato, se non si conforma ai requisiti.
    Però lo trovo troppo "talebano"
    Ti faccio un esempio: stai creando un'applicazione che permette agli utenti di postare messaggi con una firma. In base alle tue regole di sicurezza, quando l'utente inserisce una firma con codice HTML...
    Ma non ci penso proprio, ma neanche lontanamente.
    Dopo aver sfogliato faticosamente decine di siti e migliaia di esempi di vulnerabilità, con esempi nei CMS (Drupal ho scoperto essere un colabrodo ad esempio) proprio non ci penso affatto.
    Anzi sto lavorando per ridurre al minimo il codice, una ventina di file, e pure corti, per poterli esaminare e riesaminare con cura, senza "robe fighe" ma che poi complicano il flusso e rendono difficile da capire.
    Meno funzioni ci sono, meno si possono attaccare.

    Riassumo: lasciando stare gli aspetti filosofici (che non mi interessano), nè la possibilità di fare in futuro non so che cose fiche (che non mi interessano), l'approccio che ho esposto può dare un livello di sicurezza ragionevole anche per un dilettante PHP ?
    Poi che il programma non sia figo come uno vulnerabile (potenzialmente, oppure no) me ne farò una ragione.

    O la scelta migliore è semplicemente "cerca di seguire le 50.000 modalità con cui un sito PHP è vulnerabile?" Perchè francamente messa così direi che in grado di scrivere siti sicuri in PHP non c'è nessuno al mondo (e, probabilmente, è la verità)

  4. #24
    Utente bannato
    Registrato dal
    Jul 2013
    Messaggi
    290
    Quote Originariamente inviata da k.b Visualizza il messaggio
    Esatto, la validazione e' un altro discorso, e comunque un dato non validato deve generare una exception, non deve essere "ripulito".
    Intervengo su questo aspetto: secondo le "best practices" non è il modo giusto di operare.
    O meglio non il migliore.
    Perchè basta che dimentichi UNA volta di "sanificare" l'input che la frittata è fatta (viene ripetuto come concetto più volte).
    Qualsiasi approccio che sia insicuro per default porta a rischi.
    Un po' come mettersi in casa del materiale esplosivo: certo se non gli dai fuoco non esplode.
    Però basta una distrazione e booooom.

  5. #25
    Utente di HTML.it L'avatar di .Kurt
    Registrato dal
    Jul 2007
    Messaggi
    654
    A dir la verità non lo fa minimamente, perchè non tiene conto di XSS e quindi di pezzi html, css o javascript
    Usi prepared statement per inserire in sicurezza i tuoi dati nel database, questo è tutto. Cosa fare con quei dati è un problema tuo: quando li salvi il database non è onnisciente al punto tale da sapere dove vorrai usarli ed in quale contesto.
    La tua intenzione è di rimediare tu stesso "purgando" i dati prima di salvarli, ed utilizzandoli così come sono quando li vai a recuperare. Questo è un errore. Perché:
    1. Come ti hanno già detto ti salvi dati corrotti. L'input inserito dall'utente non corrisponderà a quello salvato nel database, e questo non deve succedere. Piuttosto, se a livello di applicazione c'è qualcosa che non vuoi salvare, lancia una eccezione ed informa l'utente che quello che ha inserito non va bene.
    2. "Purgando" la stringa prima di salvarla nel database vincoli quei dati ad un solo utilizzo. Ma, oltre che essere stampati a video in una pagina html, potrebbero essere inviati via email, o utilizzati in altre query. Inoltre, cosa succederebbe se ti accorgessi tempo dopo che la funzione con cui vai a filtrare i contenuti manca di qualcosa? Ri-salvi tutti i dati del tuo database secondo il nuovo formato?

    Il lavoro di togliere pezzi html, script, parolacce, tutte le parole che iniziano con la lettera "S", o quello che ti pare, lo fai quando vai ad utilizzare quei dati. E lo fai tenendo conto di dove li stai utilizzando: che sia dentro un < p > o come parametro di una querystring di un collegamento ipertestuale, o come stringa js, le strategie da adottare quando le stampi sono diverse.

    Se poi questi valori li usi per generare nomi delle tabelle, allora guarda fai prima a far si che i il valore sia fatto solo da lettere e numeri e senza spazi, al limite gli underscore, perchè tutti gli altri caratteri non andrebbero bene.
    E non basterebbero comunque. Se dovessi utilizzare parole chiave dovresti limitare il nome della tabella con delle backticks.
    dbal\Connection::quoteIdentifier ti mostra una implementazione di come si potrebbe fare, ma cosa ben più rilevante è il commento:
    * NOTE: Just because you CAN use quoted identifiers doesn't mean
    * you SHOULD use them. In general, they end up causing way more
    * problems than they solve.
    Ad esempio,
    Essenzialmente N clienti hanno N tabelle (pippo_documenti, pluto_documenti, sempronio_documenti) uguali, ma ovviamente sono diversi (i clienti), e non è che siano proprio contenti qualora "mischiassi" i dati.
    C'è un motivo per cui non puoi avere una sola tabella chiamata "documenti" con una colonna "cliente"?
    Eh... magari... ovviamente i dati forniti dall'utente DEVONO andare a finire nella query
    Qualche post fa ti hanno accennato cos'è prepared statement.
    Quindi, la risposta a
    l'approccio che ho esposto può dare un livello di sicurezza ragionevole anche per un dilettante PHP ?
    è un secco no.

    Drupal ho scoperto essere un colabrodo ad esempio
    Puoi approfondire?
    Ultima modifica di .Kurt; 14-09-2015 a 13:37

  6. #26
    Quote Originariamente inviata da brancomat Visualizza il messaggio
    Ho spiegato nel post precedente perchè è fatto così, per una "difesa in profondità" usando la granularità dei diritti dell'utente mysql (altra cosa ripresa da quel sito, ovviamente)
    Design che personalmente ritengo assolutamente privo di ogni senso, indipendentemente da chi l'abbia suggerito.

    Quote Originariamente inviata da brancomat Visualizza il messaggio
    Eh... magari... ovviamente i dati forniti dall'utente DEVONO andare a finire nella query, altrimenti il sito diventa pagine HTML e di dinamico non c'è nulla.
    Non ho capito se mi prendi in giro. Se leggi bene ho detto niente input utente nella STRINGA che compone la query, i dati ovviamente ci vanno, ma separati (come parametri). Se non e' possibile (es. nomi di tabella), allora whitelist.

    Quote Originariamente inviata da brancomat Visualizza il messaggio
    Riassumo: lasciando stare gli aspetti filosofici (che non mi interessano), nè la possibilità di fare in futuro non so che cose fiche (che non mi interessano), l'approccio che ho esposto può dare un livello di sicurezza ragionevole anche per un dilettante PHP ?
    No. L'approccio che hai esposto e' piu' compicato e meno sicuro di quelli che ti sono stati suggeriti.

  7. #27
    Quote Originariamente inviata da brancomat Visualizza il messaggio
    Intervengo su questo aspetto: secondo le "best practices" non è il modo giusto di operare.
    O meglio non il migliore.
    Perchè basta che dimentichi UNA volta di "sanificare" l'input che la frittata è fatta (viene ripetuto come concetto più volte).
    Qualsiasi approccio che sia insicuro per default porta a rischi.
    Un po' come mettersi in casa del materiale esplosivo: certo se non gli dai fuoco non esplode.
    Però basta una distrazione e booooom.
    E' un'obiezione che non ha senso. "Basta dimenticarsi una volta" si applica a qualunque ambito e qualunque approccio, basta che ti dimentichi una volta uno dei tuoi purgavalore() e sei nella stessa identica situazione.

    Non esiste nessun paradigma che ti metta al sicuro dagli errori del programmatore.

  8. #28
    Quote Originariamente inviata da brancomat Visualizza il messaggio
    A dir la verità non lo fa minimamente, perchè non tiene conto di XSS e quindi di pezzi html, css o javascript
    Non lo fa perche' non e' il suo mestiere. XSS, html, css, javascript non significano nulla e non pongono nessun pericolo per il database, hanno significato solo se li metti in una pagina visualizzata da un browser, motivo per cui ha senso prendere le dovute precauzioni quando invii quei dati a un browser e non quando li salvi nel database.

  9. #29
    Utente bannato
    Registrato dal
    Jul 2013
    Messaggi
    290
    Quote Originariamente inviata da .Kurt Visualizza il messaggio
    Usi prepared statement per inserire in sicurezza i tuoi dati nel database, questo è tutto. Cosa fare con quei dati è un problema tuo: quando li salvi il database non è onnisciente al punto tale da sapere dove vorrai usarli ed in quale contesto.
    La tua intenzione è di rimediare tu stesso "purgando" i dati prima di salvarli, ed utilizzandoli così come sono quando li vai a recuperare.
    Il punto è impedire l'esecuzione di codice dentro le pagine nel momento della visualizzazione (XSS o le altre 1000 sottoversioni) da parte del browser.
    Se c'è del codice html, javascript etc allora, per quanto mi riguarda, è pericoloso.
    Siccome non ci deve essere, lo tolgo.
    Se l'utente è così idiota da mettere come "data operazione" invece di giorno mese anno <script> blablabla </script>... cavoli suoi.
    O meglio faccio il contrario, consento solo quello che non è pericoloso.
    Nel mio "superprogramma" per ora consento solo l'inserimento di una data, il testo ad esempio non lo puoi proprio inserire, lo prendi da un elenco già predisposto (avevo giusto aperto il relativo thread).
    Nulla vieta però, in teoria e in pratica, di chiamare le pagine PHP passando "occultamente" roba "strana" in GET, POST o addirittura in casi estremi SESSION.
    E lì il rischio per un principiante come me è grosso.
    Questo è un errore. Perché:
    1. Come ti hanno già detto ti salvi dati corrotti. L'input inserito dall'utente non corrisponderà a quello salvato nel database, e questo non deve succedere. Piuttosto, se a livello di applicazione c'è qualcosa che non vuoi salvare, lancia una eccezione ed informa l'utente che quello che ha inserito non va bene.
    non è quello il rischio che mi preoccupa, ma i 10000 metodi per "iniettare" codice malevolo in tutti i modi, dalle sessioni falsificate a chi più ne ha ne metta.
    Il "briccone" mica si lascia fermare per così poco (ho letto tutto il papier sugli errori degli interi troppo lunghi di mysql e ancora ho i brividi... prima cosa che ho aggiunto tagliare tutti i numeri più lunghi di 9 cifre...)
    2. "Purgando" la stringa prima di salvarla nel database vincoli quei dati ad un solo utilizzo. Ma, oltre che essere stampati a video in una pagina html, potrebbero essere inviati via email, o utilizzati in altre query. Inoltre, cosa succederebbe se ti accorgessi tempo dopo che la funzione con cui vai a filtrare i contenuti manca di qualcosa? Ri-salvi tutti i dati del tuo database secondo il nuovo formato?
    Non è un punto che mi sia chiaro, i dati vengono poi elaborati da un gestionale "tradizionale" visual basic, lì il rischio è praticamente nullo (per l'esecuzione di codice malevolo).
    La cosa da evitare è che vengano modificati i dati in forma non prevista, letti più dati di quelli previsti, e impedito che i singoli utenti dei singoli clienti possano accedere "fuori dal loro orticello".
    Insomma compartimentazione.

    Il lavoro di togliere pezzi html, script, parolacce, tutte le parole che iniziano con la lettera "S", o quello che ti pare, lo fai quando vai ad utilizzare quei dati...
    Nei vari siti che ho letto questa strategia è sconsigliata, per i motivi già indicati più volte.
    Se solo UNA volta te lo dimentichi apri una voragine ,perchè adotti un meccanismo insicuro per default.
    Cioè ti tieni degli esplosivi in casa e, ogni volta che li tiri fuori, devi ricordarti di non fumare (analogia che ho letto)

    Ad esempio,
    C'è un motivo per cui non puoi avere una sola tabella chiamata "documenti" con una colonna "cliente"?
    Sì, sono 3, e li ho già scritti
    1) facilità-difficoltà di fare backup e restore dei singoli clienti. con mysql è una rogna incredibile fare un mysqldump di solo una parte, e 1000 volte peggio fare il restore (bisogna cancellare una porzione del db e francamente non ci penso neppure lontanamente, mi sembra una fonte di disastri che aspetta il momento di "esplodere" ticchettando)
    2) i clienti non vogliono mischiare i loro dati con quelli dei concorrenti (in caso di errore del programma potrebbero più facilmente vederli, e questo è davvero malissimo)
    3) difesa in profondità con l'utilizzo di viste specifiche e GRANT mysql minimi (sempre seguendo il consiglio di partire dall'ipotesi peggiore, ovvero buco e compromissione di tutto e di più)

    Puoi approfondire?
    Se vai nelle "top 10 vulnerabilità del 2013" di OWASP vengono mostrati esempi dei difetti di progetto e di implementazione che colpiscono più frequentemente PHP, e come esempio concreto (spesso) quelli di drupal.
    La cosa che mi è piaciuta di più del sito è che spiega le vulnerabilità, poi mette "guarda qui come hanno bucato il programma X con questa tecnica"
    Poi non ti so dire se è il sito "migliore" in assoluto, lurkando però su stackoverflow lo davano come di grande affidabilità

  10. #30
    Utente bannato
    Registrato dal
    Jul 2013
    Messaggi
    290
    Quote Originariamente inviata da k.b Visualizza il messaggio
    E' un'obiezione che non ha senso. "Basta dimenticarsi una volta" si applica a qualunque ambito e qualunque approccio, basta che ti dimentichi una volta uno dei tuoi purgavalore() e sei nella stessa identica situazione.

    Non esiste nessun paradigma che ti metta al sicuro dagli errori del programmatore.
    Invece sì.
    Nel senso che la procedura che salva nel db (ad esempio) purga sempre i dati.
    E chiami quella (prima o poi imparerò a fare un metodo della classe).
    Quindi non puoi evitare di usarla.
    Analogamente facendo un grep degli "echo" e sostituendo con "write" o "echopurgata", print_r e così via usi sempre funzioni "sicure per default"

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.