Как безопасно записывать данные JSON в файл с помощью PHP

У меня есть HTML-форма для редактирования изображений. Все данные хранятся в JSON. Когда я меняю текущее изображение, я хочу сохранить изменения с помощью PHP script в текстовый файл. Если я вернусь к предыдущему изображению, эта конфигурация будет снова отправлена ​​из этого файла в форму.

Мой вопрос:

Как безопасно писать и читать этот вид данных. Где и как эффективно проверять данные для предотвращения некоторых инъекций кода 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;
}

Ответы

Ответ 1

Прежде всего: 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

Проблема с вашим кодом заключается в том, что он не будет работать, проблемы с безопасностью. Вы должны либо сериализовать данные, либо закодировать их на 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;
}

До тех пор, пока вы убедитесь, что путь, который вы читаете/записываете, верен, с этим кодом не возникает проблем с инъекцией кода. Единственная потенциальная проблема заключается в том, что вы можете выбрать, какой файл использовать (а не hardcode "config.txt" в коде). Затем вам нужно будет проверить, чтобы файл находился в данном каталоге и т.д.

Ответ 3

Я всегда проверял возвращаемые данные, чтобы увидеть, есть ли он в формате, который я ожидаю. Скажем, вы сохраняете изображение... Проверьте его с помощью проверок MIME и т.д., Чтобы убедиться, что это изображение. Если вы просто сохраните данные, как есть на сервере, вы можете открыть дверь для некоторых потенциальных проблем безопасности.

Если вы имеете в виду, что вы просто сохраняете данные о просмотре изображений, все равно может возникнуть проблема в зависимости от того, как и где эти данные будут доступны и будут использоваться. Поэтому, если вы за исключением целого числа и не более того, убедитесь, что данные, которые вы получаете и сохраняете, являются целыми числами и не более.