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

Max*_*nas 15 php security json file 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;
    }
});
Run Code Online (Sandbox Code Playgroud)

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;
}
Run Code Online (Sandbox Code Playgroud)

Jak*_*ger 6

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

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

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;
}
Run Code Online (Sandbox Code Playgroud)

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


Gum*_*mbo 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);
Run Code Online (Sandbox Code Playgroud)

  • 我从来没有说过JSON是JavaScript.我知道不同之处.这几乎就像说PHP是一个数组:) (3认同)