保护原始JSON数据不被复制

Protecting raw JSON data from being copied

本文关键字:复制 数据 原始 JSON 保护      更新时间:2023-09-26

我正在用Node.js和Mongo DB创建一个应用程序,用Swig渲染视图。我有一个企业名称、地址和地理位置数据的数据库,这些数据正在用别针绘制在谷歌地图上。

我想阻止用户使用视图源、Firebug、Chrome Dev工具等轻松复制原始JSON数据。

我不追求银行级安全,只是想让大多数用户放弃它。

我有两种将JSON包传递到浏览器的途径:

1) 使用Swig,将JSON包直接传递到视图。问题是,一个简单的视图源将显示JSON。

2) 使用AJAX调用请求数据。在这种情况下,使用Chrome开发工具可以很容易地访问数据。

我有什么选择?

Base-64对字符串进行编码
然后你可以用JavaScript对它进行base64解码
这应该会让它变得足够不可读,当然没有真正的安全性
而且速度很快。

您需要注意UTF-8字符(例如德语或法语)

例如,在JavaScript:中是这样的

var str = "äöüÄÖÜçéèñ";
var b64 = window.btoa(unescape(encodeURIComponent(str)))
console.log(b64);
var str2 = decodeURIComponent(escape(window.atob(b64)));
console.log(str2);

示例:

 var imgsrc = 'data:image/svg+xml;base64,' + btoa(unescape(encodeURIComponent(markup)));
 var img = new Image(1, 1); // width, height values are optional params 
 img.src = imgsrc;

更安全的变体:
返回加密的base64编码的JSON,加上解密算法,base64在服务器端对其进行编码,将其位移几位,通过ajax返回,然后在网页上对字符串进行去位移,将其传递给eval,eval将为您提供解密功能,然后解密加密后的base64字符串,然后base-64对该字符串进行解码。

但在chrome调试控制台上解密只需要几秒钟的时间,我确实解密过一次这样的东西,我想在codecanyon上可以免费获得"Tabs"脚本;(不要为标签而烦恼,它们是膨胀软件,最好自己投入时间);)

我想你现在在这里发现了http://www.slidetabs.com/,但我不知道"加密"方法是否还在。

此外,您还可以在JavaScript中转义字符串,然后看起来像这样:

var _0xe91d=["'x28'x35'x28'x24'x29'x7B'x24'x2E'x32'x77'x2E
...

x5F'x63'x6F'x6E'x74'x5F'x64'x75'x72'x7C'x76'x5F'x74'x61'x62'x73'x5F'x61'x6C'x69'x67'x6E'x7C'x76'x5F'x74'x61'x62'x73'x5F'x64'x75'x72'x7C'x76'x5F'x73'x63'x72'x6F'x6C'x6C'x7C'x63'x6F'x6E'x74'x5F'x61'x6E'x69'x6D'x7C'x63'x6F'x6E'x74'x5F'x66'x78'x7C'x74'x61'x62'x5F'x66'x78'x7C'x72'x65'x70'x6C'x61'x63'x65'x7C'x62'x61'x6C'x69'x67'x6E'x7C'x61'x6C'x69'x67'x6E'x5F'x7C'x75'x6E'x6D'x6F'x75'x73'x65'x77'x68'x65'x65'x6C'x7C'x73'x77'x69'x74'x63'x68'x7C'x64'x65'x66'x61'x75'x6C'x74'x7C'x6A'x51'x75'x65'x72'x79","","'x66'x72'x6F'x6D'x43'x68'x61'x72'x43'x6F'x64'x65","'x72'x65'x70'x6C'x61'x63'x65","'x5C'x77'x2B","'x5C'x62","'x67"]
;eval(function (_0x173cx1,_0x173cx2,_0x173cx3,_0x173cx4,_0x173cx5,_0x173cx6){_0x173cx5=function (_0x173cx3){return (_0x173cx3<_0x173cx2?_0xe91d[4]:_0x173cx5(parseInt(_0x173cx3/_0x173cx2)))+((_0x173cx3=_0x173cx3%_0x173cx2)>35?String[_0xe91d[5]](_0x173cx3+29):_0x173cx3.toString(36));} ;if(!_0xe91d[4][_0xe91d[6]](/^/,String)){while(_0x173cx3--){_0x173cx6[_0x173cx5(_0x173cx3)]=_0x173cx4[_0x173cx3]||_0x173cx5(_0x173cx3);} ;_0x173cx4=[function (_0x173cx5){return _0x173cx6[_0x173cx5];} ];_0x173cx5=function (){return _0xe91d[7];} ;_0x173cx3=1;} ;while(_0x173cx3--){if(_0x173cx4[_0x173cx3]){_0x173cx1=_0x173cx1[_0xe91d[6]]( new RegExp(_0xe91d[8]+_0x173cx5(_0x173cx3)+_0xe91d[8],_0xe91d[9]),_0x173cx4[_0x173cx3]);} ;} ;return _0x173cx1;} (_0xe91d[0],62,284,_0xe91d[3][_0xe91d[2]](_0xe91d[1]),0,{}));

然后,您可以将字符串恢复为:

"'x66'x72'x6F'x6D'x43'x68'x61'x72'x43'x6F'x64'x65".toString()

但对于一个中等水平的程序员(比如我)来说,要想弄清楚系统并解密所有这些组合的数据,只需要appx。15-30分钟,(实验发现,来自codecanyon尝试)。

值得怀疑的是,这样的事情是否值得你花费时间,因为像我这样的人对你的"加密"进行逆向工程所花费的时间比你对它进行"编码"所花费的更少

请注意,如果您在应用程序中放入类似"''x66''x72''x6F''x6D''x43''x68''x61''x72''x43''x6F''x64''x65"的字符串,您可能会在某些病毒扫描程序(McAffee、TrendMicro、Norton等,通常的嫌疑人)上触发假警报。

您还可以将JSON字符串划分为一个JSON字符串块数组,使其更难解密(也许根据特定系统旋转数组中的序列也会有所帮助)。

您还可以将字符串分解为一个字符数组:

var x = ['a', 'b', 'c'];

然后你可以像一样把它带回来

console.log(x.join(""));

您也可以反转字符串,并将其放入一个数组中(amCharts就是这样做的)
然后你用把它带回来

x.reverse().join("");

最后一个可能对utf-8来说很棘手,因为你需要正确地反转像"Les misérables"这样的字符串(也可以参见这个和这个)

由于数据将在你的客户端计算机上,除了。。。不发送。

因此,您可以在服务器端呈现一些视图并将它们发送到客户端,但在您的情况下可能不可行。

另一种方式是发送数据,但让未经授权的用户难以访问

如果您的应用程序使用用户数据库,则可以为每个用户生成一个固定密钥,并在将合理的数据发送到客户端之前对其进行加密,然后客户端将使用客户端计算的相同密钥对其进行解密。

此外,您还可以微调要向每个用户发送或不发送的数据。

如果您想在客户端接收数据和数据进入地图之间保护数据,恐怕这是不可能的,因为您使用的地图组件可能正在等待标准JSON数据。

无论如何,保护你的数据是没有意义的,因为它会显示在你的地图上。

传递给客户端的所有内容都是不安全的,您可以尝试混淆数据,但最终只需添加一行console.log()就可以访问您放置在地图中的位置

另一种选择,我只是猜测,因为我真的不确定谷歌地图是如何工作的,但你可能首先只向地图发送地理位置,这样你就会在地图上有引脚,只有在点击ping后,你才能从api中获取其他数据(名称、地址)。谷歌地图应该支持类似onclick的功能。

用每个人在这个线程和其他线程上谈论的所有技巧来攻击潜在的刮刀/黑客。但正如人们多次说过的那样,一旦数据被发送到客户端,它基本上是不受保护的。

也许你的想法也应该包括这些事情:

-如何识别某人何时进行刮擦(例如监控IP、阈值、用户活动等)并采取措施,或者至少识别罪魁祸首。

-把版权和其他标识放在你能做的任何事情上,帮助其他用户看到并理解这是你的数据,而不是刮擦者的数据。看看艺术家们已经做了很长一段时间了。

-在你的数据中设置隐藏的陷阱,以帮助识别它的唯一性;只有你知道,刮刀不会费心寻找或懒得检查。如果刮刀也公开使用你的数据,那么也许这可以用于法律案件,或者至少你可以公开羞辱罪犯。