Как безопасно записывать данные 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 и т.д., Чтобы убедиться, что это изображение. Если вы просто сохраните данные, как есть на сервере, вы можете открыть дверь для некоторых потенциальных проблем безопасности.
Если вы имеете в виду, что вы просто сохраняете данные о просмотре изображений, все равно может возникнуть проблема в зависимости от того, как и где эти данные будут доступны и будут использоваться. Поэтому, если вы за исключением целого числа и не более того, убедитесь, что данные, которые вы получаете и сохраняете, являются целыми числами и не более.