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



我有一个用于编辑图像的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示例(读写.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;
}

您的代码的问题是它不起作用,安全问题除外。在将数据存储在文件中之前,您必须序列化数据,或者将其编码为json,例如:

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

串行化工作如下:

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")。然后,您必须进行验证,以确保文件位于给定的目录等中。

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

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

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

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

如果你的意思是只保存查看了哪些图像的数据,那么根据访问和使用这些数据的方式和地点,它仍然可能会带来问题。因此,如果除了一个整数之外,请确保接收和保存的数据是一个整数,而不是更多。

相关内容

  • 没有找到相关文章

最新更新