如何使用PHP安全地将JSON数据写入文件

时间:2011-05-31 11:44:43

标签: php json file security code-injection

我有用于编辑图像的HTML表单。所有数据都存储在JSON中。当我更改当前图像时,我想通过PHP脚本将更改保存到文本文件中。如果我返回上一张图像,此配置将再次从此文件发送到表单。

我的问题是:

如何安全地写入/读取此类数据。在何处以及如何有效地检查数据以防止某些JS / PHP代码注入?

我在下面附上了一些概念代码:

JavaScript(使用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示例(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;
}

3 个答案:

答案 0 :(得分:6)

您的代码存在的问题是它不起作用,安全问题不在考虑范围内。您必须序列化数据,或者在将数据存储到文件中之前将其编码为json,即。像这样:

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

Serialising的工作原理如下:

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

只要确保您读/写的路径是正确的,此代码就没有代码注入问题。唯一可能的问题是,如果您可以选择使用哪个文件(而不是将“config.txt”硬编码到代码中)。然后你必须验证以确保文件在给定的目录中等。

答案 1 :(得分:5)

首先:JSON不是JavaScript,反之亦然。 JSON甚至不是JavaScript的合适子集。

除此之外,由于您既没有将某些用户输入解释为PHP,也没有将某些输出解释为JavaScript,因此无需担心。但是不要忘记正确指定输出:

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

答案 2 :(得分:0)

我总是会检查返回的数据,看它是否是我期望的格式。假设您正在保存图像...使用MIME检查等检查它以确保它是图像。如果您只是按原样在服务器上保存数据,则可能会出现一些潜在的安全问题。

如果您的意思是只保存有关查看哪些图像的数据,则可能会出现问题,具体取决于访问和使用数据的方式和位置。因此,如果除了整数之外没有其他内容,请确保您收到并保存的数据是整数,仅此而已。