我有用于编辑图像的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;
}
答案 0 :(得分:6)
您的代码存在的问题是它不起作用,安全问题不在考虑范围内。您必须序列化数据,或者在将数据存储到文件中之前将其编码为json,即。像这样:
switch ($_REQUEST['action']) {
case 'write':
file_put_contents('config.txt', json_encode($_REQUEST['config']));
break;
case 'read':
readfile('config.txt');
break;
}
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;
}
只要确保您读/写的路径是正确的,此代码就没有代码注入问题。唯一可能的问题是,如果您可以选择使用哪个文件(而不是将“config.txt”硬编码到代码中)。然后你必须验证以确保文件在给定的目录中等。
答案 1 :(得分: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);
答案 2 :(得分:0)
我总是会检查返回的数据,看它是否是我期望的格式。假设您正在保存图像...使用MIME检查等检查它以确保它是图像。如果您只是按原样在服务器上保存数据,则可能会出现一些潜在的安全问题。
如果您的意思是只保存有关查看哪些图像的数据,则可能会出现问题,具体取决于访问和使用数据的方式和位置。因此,如果除了整数之外没有其他内容,请确保您收到并保存的数据是整数,仅此而已。