2011-05-31 68 views
15

我已经有用于编辑图像的HTML表单。所有数据都以JSON格式存储。当我更改当前图像时,我想通过PHP脚本将更改保存到文本文件中。如果我返回到上一张图像,则此配置将从此文件再次发送到表单。如何安全地将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示例(读 - 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

取决于正在做什么** JavascriptJSON_Obj **我会说。它可以打开潜在的远程文件包括的大门。 – inquam 2011-05-31 11:57:52

+1

只需将其保存为文本数据,然后将其作为文本数据加载即可。没有什么不安全的。你应该考虑的唯一事情 - 访问权限。你应该将这些信息存储在一个不能通过浏览器直接访问的目录中(这就是为什么你有* read *'config.txt'的'read-write.php')。您也可以考虑将这些数据存储在数据库中。 – binaryLV 2011-05-31 11:59:18

回答

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

我从来没有说过JSON是JavaScript。我知道区别。这几乎就像说PHP是一个数组:) – 2011-05-31 12:04:16

+1

那么,在某些情况下,它可能是不安全的。例如,数据可能存储在一个名为'$ _SERVER ['DOCUMENT_ROOT']的文件中。 '/ data.php',可以通过访问'http:// example.com/data.php'来执行。虽然,用户必须知道文件的名称,并且该文件必须由服务器*执行*(.txt文件通常不是*可执行文件*)。 – binaryLV 2011-05-31 12:07:20

0

我会经常检查返回的数据,看它是否是我期望的格式。假设你正在保存一张图片......使用MIME检查等来检查它,以确保它是一张图片。如果您只是在服务器上保存数据,则可能会出现一些潜在的安全问题。

如果您的意思是只保存有关查看哪些图像的数据,则依赖于访问和使用数据的方式和位置可能仍然存在问题。所以,如果你除了一个整数,只有一个,并确保你收到和保存的数据是一个整数,没有更多。

+0

据我所知,检查MIME是不安全的,因为根本不检查它。如果你想确保“图像”真的是一个图像,你应该检查数据的结构,而不是一些代表文件扩展名的文本信息。 – binaryLV 2011-05-31 12:11:49

+0

不,当然... MIME只是第一步检查。如果这是关闭的,那么它显然不是图像。但是,然后你可以尝试实际加载图像,以确保它是一个有效的图像。 – inquam 2011-05-31 12:14:15

+0

OP正试图存储JSON数据,而不是图像或整数。 – 2011-05-31 12:16:10

6

您的代码存在的问题是,它不起作用,不考虑安全问题。你必须序列化数据,或者将其编码为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”硬编码到代码中)。然后你必须验证,以确保该文件是在一个给定的目录等

+0

@Jacob,谢谢你指出这个。序列化在我的情况下是不需要的。我将只存储简单的数据,如文本和数字。 – 2011-05-31 12:19:41

+0

哦,然后我误解了。我认为'JavaScriptJSON_Obj'是一个任意JavaScript对象或数组的占位符。 – 2011-05-31 12:22:03

+0

实际上,在我的JS脚本下,'JavaScriptJSON_Obj'是一个对象,但只是为了方便。 – 2011-05-31 12:25:08

相关问题