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

У меня есть 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; } 

Прежде всего: JSON – это не JavaScript, а наоборот. И JSON даже не является подходящим подмножеством JavaScript.

Кроме того, поскольку вы не интерпретируете какой-либо пользовательский ввод как PHP, а некоторый вывод как JavaScript, вам не нужно беспокоиться. Но не забудьте указать свой результат правильно:

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

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

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

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