2011-05-31 28 views
15

Ho un modulo HTML per la modifica delle immagini. Tutti i dati sono archiviati in JSON. Quando cambio l'immagine corrente, voglio salvare le modifiche, tramite lo script PHP, in un file di testo. Se torno all'immagine precedente, questa configurazione verrà inviata nuovamente da questo file al modulo.Come scrivere in modo sicuro i dati JSON su file utilizzando PHP

La mia domanda è:

Come scrivere/leggere questo tipo di dati in modo sicuro. Dove e quanto efficacemente controllare i dati per evitare alcune iniezioni di codice JS/PHP?

Ho allegato un certo codice concetto di seguito:

JavaScript (utilizzando jQuery):

// Writing 
$.ajax({ 
    global: false, 
    type: "POST", 
    cache: false, 
    dataType: "json", 
    data: ({ 
     action: 'write', 
     config: JavaScriptJSON_Obj 
    }), 
    url: 'read-write.php' 
}); 

// Reading 
$.ajax({ 
    global: false, 
    type: "POST", 
    cache: false, 
    dataType: "json", 
    data: ({ 
     action: 'read' 
    }), 
    url: 'read-write.php', 
    success: function(data){ 
     JavaScriptJSON_Obj = data; 
    } 
}); 

PHP esempio (lettura write.php):

switch ($_REQUEST['action']) { 
    case 'write': 
     file_put_contents('config.txt', $_REQUEST['config']); 
     break; 
    case 'read': 
     $s = file_get_contents('config.txt'); 
     echo json_encode($s); 
     break; 
} 
+0

Dipende da cosa viene fatto con ** JavascriptJSON_Obj ** direi. Potrebbe aprire la porta per i potenziali file remoti inclusi. – inquam

+1

Basta salvarlo come dati testuali e quindi caricarlo come dati testuali. Non c'è nulla di pericoloso. L'unica cosa che dovresti considerare - i diritti di accesso. Dovresti memorizzare queste informazioni in una directory che non è direttamente accessibile tramite browser (ecco perché hai 'read-write.php' per * reading *' config.txt'). Si potrebbe anche considerare di memorizzare questi dati in DB. – binaryLV

risposta

5

Prima di tutto : JSON non è JavaScript e viceversa. E JSON non è nemmeno un sottoinsieme appropriato di JavaScript.

Oltre a ciò, poiché non si interpretano alcuni input dell'utente come PHP né alcun output come JavaScript, non è necessario preoccuparsi. Ma non dimenticare di specificare correttamente l'output:

header('Content-Type: application/json;charset=utf-8'); 
$s = file_get_contents('config.txt'); 
echo json_encode($s); 
+2

Non ho mai detto che JSON sia JavaScript. Conosco la differenza È quasi come dire che PHP è un array :) –

+1

Beh, in alcuni casi potrebbe essere potenzialmente pericoloso. Ad esempio, i dati potrebbero essere memorizzati in un file chiamato '$ _SERVER ['DOCUMENT_ROOT']. '/ data.php'', che potrebbe essere eseguito accedendo a 'http: // example.com/data.php'.Però, l'utente dovrebbe conoscere il nome di un file e il file dovrebbe essere * eseguibile dal server * (i file .txt di solito non sono * eseguibili *). – binaryLV

0

Vorrei sempre controllare i dati restituiti per vedere se è in un formato che mi aspetto. Diciamo che stai salvando un'immagine ... Controllala usando i controlli MIME, ecc. Per assicurarti che sia un'immagine. Se si salvano solo i dati così come sono sul server, è possibile aprire la porta per alcuni potenziali problemi di sicurezza.

Se si intende che si limitano a salvare i dati relativi a quali immagini sono state visualizzate, ciò potrebbe comunque rappresentare un problema in base a come e dove tali dati sono accessibili e utilizzati. Quindi se tu eccetto un numero intero e niente di più, assicurati che i dati che ricevi e salvino siano interi e niente di più.

+0

Per quanto ne so, controllare MIME è pericoloso come non controllarlo affatto. Se vuoi assicurarti che l'immagine sia realmente un'immagine, devi controllare la struttura dei dati, non alcune informazioni testuali che rappresentano l'estensione del nome del file. – binaryLV

+0

No, certo ... Il MIME è solo un primo controllo. Se è spento, allora è OVVIAMENTE non un'immagine. Ma poi potresti provare a caricare effettivamente l'immagine per assicurarti che sia un'immagine valida. – inquam

+0

L'OP sta tentando di memorizzare i dati JSON, non le immagini o i numeri interi. –

6

Il problema con il codice è che non funzionerà, a parte i problemi di sicurezza. È necessario serializzare i dati o codificarli su json PRIMA di memorizzarli in un file, ad es. in questo modo:

switch ($_REQUEST['action']) { 
    case 'write': 
     file_put_contents('config.txt', json_encode($_REQUEST['config'])); 
     break; 
    case 'read': 
     readfile('config.txt'); 
     break; 
} 

serializzazione funziona così:

switch ($_REQUEST['action']) { 
    case 'write': 
     file_put_contents('config.txt', serialize($_REQUEST['config'])); 
     break; 
    case 'read': 
     $data = unserialize(file_get_contents('config.txt')); 
     echo json_encode($data); 
     break; 
} 

Finché è assicurarsi che il percorso di leggere/scrivere è corretto, non ci sono problemi di iniezione di codice con questo codice. L'unico problema potenziale è se puoi scegliere quale file usare (piuttosto che hardcode "config.txt" nel codice). Quindi devi convalidare per assicurarti che il file sia in una determinata directory, ecc.

+0

@Jacob, grazie per aver indicato questo. La serializzazione è, nel mio caso, non necessaria. Conserverò solo dati semplici come testo e numeri. –

+0

Oh, quindi ho frainteso. Pensavo che 'JavaScriptJSON_Obj' fosse un segnaposto per un oggetto o un array arbitrario javascript. –

+0

Beh, in effetti, sotto il mio script JS, 'JavaScriptJSON_Obj' è un oggetto, ma solo per comodità. –

Problemi correlati