Comment écrire en toute sécurité des données JSON dans un fichier en utilisant PHP

j'ai un format HTML pour éditer des images. Toutes les données sont stockées dans JSON. Quand je change l'image courante, je veux enregistrer les modifications, à travers le script PHP, dans un fichier texte. Si je retourne à l'image précédente, cette configuration sera envoyée de nouveau à partir de ce fichier vers le formulaire.

Ma question est:

Comment écrire/lire ce genre de données en toute sécurité. Où et comment vérifier efficacement les données pour empêcher certaines injections de code JS / PHP?

j'ai joint un certain concept le code ci-dessous:

JavaScript (à l'aide de 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;
    }
});

exemple PHP (read-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;
}
15
demandé sur Max Barnas 2011-05-31 15:44:43

3 réponses

tout d'abord: JSON n'est pas JavaScript et vice versa. Et JSON n'est même pas un sous-ensemble approprié de JavaScript.

En outre, puisque vous n'interprétez pas une entrée utilisateur comme PHP ou une sortie comme JavaScript, il n'y a pas lieu de s'inquiéter. Mais n'oubliez pas de spécifier votre sortie correctement:

header('Content-Type: application/json;charset=utf-8');
$s = file_get_contents('config.txt');
echo json_encode($s);
5
répondu Gumbo 2011-05-31 11:55:24

le problème avec votre code est qu'il ne fonctionnera pas, les problèmes de sécurité mis à part. Vous devez soit sérialiser les données, soit les encoder à json avant de les stocker dans un fichier, c'est-à-dire. comme ceci:

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

Serialising fonctionne comme ceci:

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;
}

aussi longtemps que vous vous assurez que le chemin que vous lisez/écrivez est correct, il n'y a aucun problème d'injection de code avec ce code. Le seul problème potentiel est si vous pouvez choisir quel fichier utiliser (plutôt que la configuration "hardcode".txt" dans le code.) Ensuite, vous auriez à valider pour vous assurer que le fichier est dans un répertoire donné, etc.

6
répondu Jakob Egger 2011-05-31 12:13:18

je vérifierais toujours les données retournées pour voir si elles sont dans un format que j'attends. Dites que vous sauvegardez une image... Vérifiez en utilisant les vérifications MIME, etc. assurez-vous que c'est une image. Si vous venez d'enregistrer les données sur le serveur, ouvrez la porte pour certains problèmes de sécurité potentiels.

si vous voulez dire que vous sauvegardez simplement les données sur les images qui ont été vues, cela peut toujours poser un problème selon la façon et l'endroit où ces données sont consultées et utilisées. Donc si vous excepté un entier et rien de plus, assurez-vous que les données que vous recevez et enregistrez est un entier et rien de plus.

0
répondu inquam 2011-05-31 12:01:54