2011-05-31 30 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