Visualizzazione dei risultati da 1 a 6 su 6
  1. #1
    Utente di HTML.it L'avatar di P75
    Registrato dal
    Jul 2001
    Messaggi
    41

    Dubbio validazione/sicurezza Json

    Sto lavorando su uno script PHP che riceve da un form una stringa in base64, tale stringa contiene dei dati serializzati in json tramite un'implementazione in LUA:

    Codice PHP:
        /**
        * Verifica che una stringa sia in base64
        */
        
    private function isValidB64$in_data )
        {
            if( 
    preg_match'![^a-zA-Z0-9/+=]!'addslashes($in_data) ) )
            {
                return 
    false;
            }
            return 
    true;
        }

        
    /**
        * Estrai i dati e li assegna alle variaibili della classe
        */
        
    public function setData($b64char)
        {
            
    // Verifico che i dati siano compatibili con Base64:
            
    if (!$this->isValidB64($b64char))
            {
                return 
    false;
            }
            
            
    // Estrazione dei dati:
            
    $decodedB64Data base64_decode($b64char); // mah..
            
            // Verifico che i dati estratti siano in formato JSON valido.
            
    $deserializedData json_decode($decodedB64Data);
            if (
    $deserializedData === null)
            {
                return 
    false;
            }
            
            
    //Assegnazione variabili membro
            
    $this->serializedCharacter $decodedB64Data;
            
    $this->nome htmlentities($deserializedData[0], ENT_QUOTES);
            if ((int)
    $deserializedData[1]<|| (int)$deserializedData[1] > 80)
            {
                return 
    false;
            }
            
    $this->livello = (int)$deserializedData[1];
            
    $this->server htmlentities($deserializedData[2], ENT_QUOTES);
            
    $this->classe htmlentities($deserializedData[3], ENT_QUOTES);
            
    $this->razza htmlentities($deserializedData[4], ENT_QUOTES);
            return 
    true;
        } 
    Il mio dilemma è nel punto:

    // Estrazione dei dati:
    $decodedB64Data = base64_decode($b64char); // mah..

    Corro dei rischi con questa assegnazione? (Se l'utente inserisse una stringa valida in base64 ma dai contenuti alterati?)

    C'è un modo per verificare che la stringa decodificata sia nel formato giusto (JSON) senza usare json_decode()?

    Inoltre la validazione di json_decode è affidabile? Qualcuno ad esempio potrebbe inserire del codice malevolo, correttamente presentato in JSON, che agisca quando:

    $deserializedData = json_decode($decodedB64Data);

    Esiste qualche classe che mi permetta di associare uno schema ai dati ricevuti (e verificare che corrispondano)?

    Grazie per l'attenzione!

  2. #2
    Utente di HTML.it L'avatar di dottwatson
    Registrato dal
    Feb 2007
    Messaggi
    3,012

    Re: Dubbio validazione/sicurezza Json

    Originariamente inviato da P75

    Il mio dilemma è nel punto:

    // Estrazione dei dati:
    $decodedB64Data = base64_decode($b64char); // mah..

    Corro dei rischi con questa assegnazione? (Se l'utente inserisse una stringa valida in base64 ma dai contenuti alterati?)
    stai operando con codifiche/decodifiche del tutto comuni e con possibilità di codifica e decodifica senza alcuan chiave...
    C'è un modo per verificare che la stringa decodificata sia nel formato giusto (JSON) senza usare json_decode()?
    no

    Inoltre la validazione di json_decode è affidabile? Qualcuno ad esempio potrebbe inserire del codice malevolo, correttamente presentato in JSON, che agisca quando:

    $deserializedData = json_decode($decodedB64Data);
    dipende.. intendi codice che venga eseguito immediatamente alla decodifica?
    non credo...
    Esiste qualche classe che mi permetta di associare uno schema ai dati ricevuti (e verificare che corrispondano)?
    ti vuoi tutelare?
    bene, in tal caso ti consiglio di vedere come fanno i sistemi di pagamento on line delle banche per tutelarsi in caso di dialogo con e-commerce: il sistema è in alcuni casi un pò grezzo ma offre il suo buon margine di sicurezza

    ma i dati li fai viaggiare in chiaro? con base64 e json sono praticamente in chiaro...
    Non sempre essere l'ultimo è un male... almeno non devi guardarti le spalle

    il mio profilo su PHPClasses e il mio blog laboweb

  3. #3
    Utente di HTML.it L'avatar di P75
    Registrato dal
    Jul 2001
    Messaggi
    41

    Re: Re: Dubbio validazione/sicurezza Json

    Originariamente inviato da dottwatson
    stai operando con codifiche/decodifiche del tutto comuni e con possibilità di codifica e decodifica senza alcuan chiave...
    Ti spiego la situazione: il mio programma è legato a un videogame MMORPG ed ha come finalità quella di costruire un'armory.
    In questo MMORPG ogni giocatore può modificare l'interfaccia del gioco tramite addons scritti in linguaggio LUA. Io ho già realizzato un addon che si occupa di eseguire una scansione sul personaggio e colleziona informazioni sul nome, il livello, la classe (guerriero, mago...), i singoli oggetti dell'equipaggiamento, quelli contenuti nell'inventario... e così via.

    Gli elementi collezionati sono riposti in un array multidimensionale, serializzati tramite JSON, quindi codificati in base64.
    Il risultato è mostrato al player che deve fare copia/incolla della stringa ottenuta su un form presente nel sito web dell'armory.

    Ho trovato alcune implementazioni in LUA di sistemi di criptazione a doppia chiave, ma mi devo confrontare col fatto che non c'è alcuna possibilità di attivare moduli LUA sul client usato dai giocatori, e le funzioni LUA stesse - messe a disposizione dal client - sono limitate.
    Al massimo posso usare un sistema a chiave singola, e dato che l'implementazione dell'algoritmo è anch'essa fatta in LUA, chiamare la funzione di criptazione in modo ambiguo, ed includere solo la parte dedicata all'encryption nei sorgenti (magari potrei accodare un hash di parte dei dati).

    Essendo l'addon programmato in LUA, tutto il codice è in chiaro. Un utente smaliziato potrebbe decrittare i dati, o più semplicemente (davvero molto più facile), modificare l'addon nella parte che colleziona i vari elementi del pg lasciando poi che la criptazione/encoding faccia la sua parte.

    In poche parole: non ho modo di impedire all'utente di inviarmi quello che vuole, se è in grado di farlo. Posso solo provare a complicargli la vita nel caso sia una persona comune.

    Originariamente inviato da dottwatson
    ti vuoi tutelare?
    bene, in tal caso ti consiglio di vedere come fanno i sistemi di pagamento on line delle banche per tutelarsi in caso di dialogo con e-commerce: il sistema è in alcuni casi un pò grezzo ma offre il suo buon margine di sicurezza

    ma i dati li fai viaggiare in chiaro? con base64 e json sono praticamente in chiaro...
    Il problema è che i dati "non viaggiano" e non ho modo di fare altrimenti (gli addons del client non possono stabilire alcun tipo di connessione). I dati di base sono forniti dai giocatori stessi, e tramite addon non posso nascondere nulla (i sorgenti sono in chiaro, inclusi quelli degli eventuali algoritmi di criptazione o di encoding).

    Quindi, dai dati importati mi posso aspettare di tutto.

    Dove posso trovare informazioni su come fanno le banche a tutelarsi?

  4. #4
    Utente di HTML.it L'avatar di dottwatson
    Registrato dal
    Feb 2007
    Messaggi
    3,012
    lua ha possibilità di interagire con il server web a livello di files?

    nel senso.. creare e modificare files sul server?
    Non sempre essere l'ultimo è un male... almeno non devi guardarti le spalle

    il mio profilo su PHPClasses e il mio blog laboweb

  5. #5
    Utente di HTML.it L'avatar di P75
    Registrato dal
    Jul 2001
    Messaggi
    41
    Originariamente inviato da dottwatson
    lua ha possibilità di interagire con il server web a livello di files?

    nel senso.. creare e modificare files sul server?
    No no, il server di gioco è di terze parti, il client è di terze parti, gli scripts LUA che girano attraverso il client sono "blindati": non possono inviare dati a servizi esterni, non possono eseguire programmi sul computer client... non possono fare nulla che vada oltre l'interagire con le interfacce del gioco, salvare qualcosa in files posti in locazioni predefinite o mostrare dei dati al player (il mio caso).

    Non ho alcun modo di impedire l'invio di dati alterati al mio programma, ma questo avviene anche tramite un normale modulo web mi pare e sta qui il mio problema: validare e sanitizzare i dati che arrivano da JSON verificando che non contengano del codice malevolo.

    L'encoding in base64 serve solo a impedire che *chiunque* possa vedere e modificare i contenuti direttamente, ma non ha una presunzione di inviolabilità. Inviolabilità che di base non posso comunque ottenere. Se un utente dovesse decodificare i dati e cambiare il suo nome da "Merlino" a "Giannino" o il numero di monete d'oro che possiede, sarebbe un problema ma un problema poco grave rispetto ad un tentativo di attacco.

    P.S.: In realtà esiste un metodo migliore, e cioé distribuire un eseguibile che si occupi del lavoro sporco, esistono altri software che agiscono in questo modo, ma è un caso non accettabile: non voglio (e non posso) chiedere ai miei "utenti" di avviare un exe.

  6. #6
    Utente di HTML.it L'avatar di dottwatson
    Registrato dal
    Feb 2007
    Messaggi
    3,012
    potresti provare allora a salvare il json serializzato in una variabile, e poi consegnare al giocatore il nome della variabile affinchè non sappia nulla in ogni caso, poi la routine preleverà il json relativeo a lnome variabile scelto e se c'è fa un eval, viceversa da errore.

    mi dispiace ma non conosco lua e non saprei come andare oltre.

    per pulire i dati del json potresti usare le espressioni regolari e vedere che a priopri non ci siano delle stringhe malevole
    , ma non so nenache supporto dia lua alle reg_exp e con che sintassi

    Non sempre essere l'ultimo è un male... almeno non devi guardarti le spalle

    il mio profilo su PHPClasses e il mio blog laboweb

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.