2014-12-05 102 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