2014-12-05 78 views
0

我正在構建一個網站,它將在服務器上的腳本文件夾中的.js文件中有一個JS多維數組。數組中將包含視頻嵌入代碼(Vimeo iframes)以及用於作曲家,玩家和作品名稱的附加字符串。陣列中將會有大約1000個視頻。閱讀JS數組的安全問題?

var videos = [ ['embed code', 'composer name', 'player name', 'piece name'], ['embed code', 'composer name', 'player name', 'piece name']...]; 

將有用戶通過作曲家,播放器等做特定搜索一個jQuery腳本將遍歷每個內部數組來找到用戶的查詢比賽和展示他們在網頁上搜索文本框中。它看起來基本上是這樣的:

function getArray(video) { 
    if (campyear === video[j]) { 
     var pos = video.indexOf(video[j]);     
     $('#searcharea').append('<td>' + video[(pos - pos)] + '</td><td><h3>Composer: ' + video[(pos -pos) + 1] + '</h3><br><h3>Player: ' + video[(pos - pos) + 2] + '</h3><br><h3>Piece: ' + video[(pos - pos) + 3] + '</h3></td>'); 
    } 
     else 
     noResultCount++;      

     if (campyear === video[j] && count % 2 === 0) 
     $('#searcharea').append('</tr><tr>'); 

     if (campyear === video[j]) 
     count++; 

     if (i === videos.lenght && j === 4) 
     $('#searcharea').append('</table>'); 

     if (noResultCount === videos.length * 5) 
     $('#searcharea').html("<h4>No results found for " + yearvalue + " " + buttonvalue + ". Not all camps have videos for every year.</h4>"); 
     $('#searcharea').fadeIn(500); 

    } // End of getArray() 
... 
... 
... 

for (i = 0; i < videos.length; i++) { 
     for (j = 0; j < 5; j++) { 
     getArray(videos[i]);   
     } 
     } 

我知道有安全問題需要考慮傳統的SQL數據庫和PHP,但在這種情況下,我應該關心的數據或網站的任何威脅?我的想法是腳本只能讀取數據並打印出來,所以沒有太多人可以做,但我不確定。數據不敏感。

謝謝你的時間。

+2

所有的javascript源代碼都是公開的,但是如果你的數據不敏感,它應該不會造成問題 – juvian 2014-12-05 17:51:19

+0

該數組包含你希望人們「看到」的數據,對不對?如果是這樣,爲什麼會有安全問題? – 2014-12-05 17:51:31

+4

「.js文件中的一個JS多維數組」 - 停在那裏。如果你沒有使用[JSON](http://api.jquery.com/jquery.getjson/),你應該這樣做。 – Blazemonger 2014-12-05 17:51:58

回答

1

問題是,如果有人可以在讀取文件之前修改文件,他們可以將任何JavaScript代碼注入它。修改文件的一種方法是破解你的服務器,但他們也可以通過接管不需要接觸你的機器的代理來實現。他們不得不以某種方式欺騙客戶通過代理,但是你無法阻止這種情況發生。

最簡單的解決方法是使用JSON文件而不是JavaScript文件。 JSON的語法非常接近用於JS文字的語法:就我所見,從您的示例中可以看出,您需要對文件進行的唯一更改是在開始時刪除「var videos =」並將您的單引號換成雙引號。在代碼中,交換什麼工程,以這樣的效果:

// Assume that getJS() grabs your JavaScript file 
// and returns a String with the text of that file. 
var videoCode = getJS(); 
eval(videoCode); 

...的東西是這樣的:

// Assume that getJSONData() grabs your JSON 
// and returns a String with the text of the file. 
jsonData = getJSONData(); 
var videos = JSON.parse(jsonData); 

請注意,我們使用JSON.parse(這對於舊的瀏覽器polyfills)而不是eval。我們這樣做是因爲它通過專用的JSON解析器代替JavaScript代碼。 JSON不知道如何處理代碼,因此即使攻擊者試圖通過更改文件來注入代碼,更改後的代碼也不會工作,因爲JSON不知道如何處理它。顯然你不希望你的應用在中間停下來,但是比讓攻擊者接管更好。

+0

如果有人可以修改包含數據的JS文件,他們可能也可能修改包含實際應用程序邏輯的JS文件。按照這個邏輯,我根本不應該寫一個網站,因爲一切都可能被劫持。 – 2014-12-05 20:05:46

+0

@FelixKling:這隻適用於你的數據總是來自靜態文件,這不是一個非常安全的假設。越來越多的應用程序正在獲取動態生成的JSON,包括從用戶內容生成的JSON。理論上來說,這最後一個案例可以讓你理解服務器端的XSS問題:用戶可以嘗試創建格式錯誤的輸入,它會誘騙你的應用向其發送的數據中注入任意JavaScript,所有這些都不會觸及服務器上的任何文件。使用適當的JSON解析器可以防範這種可能性:即使出現XSS錯誤,JSON解析器也不會讓它通過。 – 2014-12-08 13:47:21