我有一个用于编辑图像的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示例(读写.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,例如:
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;
}
只要确保读/写的路径正确,此代码就不会出现代码注入问题。唯一潜在的问题是,您是否可以选择要使用的文件(而不是在代码中硬编码"config.txt")。然后,您必须进行验证,以确保文件位于给定的目录等中。
首先:JSON不是JavaScript,反之亦然。JSON甚至不是JavaScript的一个子集。
除此之外,由于您既不将某些用户输入解释为PHP,也不将某些输出解释为JavaScript,因此无需担心。但不要忘记正确指定您的输出:
header('Content-Type: application/json;charset=utf-8');
$s = file_get_contents('config.txt');
echo json_encode($s);
我总是检查返回的数据,看看它是否是我期望的格式。假设您正在保存图像。。。使用MIME检查等进行检查,以确保它是一个图像。如果你只是在服务器上按原样保存数据,你可能会为一些潜在的安全问题打开大门。
如果你的意思是只保存查看了哪些图像的数据,那么根据访问和使用这些数据的方式和地点,它仍然可能会带来问题。因此,如果除了一个整数之外,请确保接收和保存的数据是一个整数,而不是更多。