我正在使用Google Maps JS API v3制作一种类型为“猜测这个卫星/航拍视图中的地点/纪念碑/等等”的浏览器内游戏。我不能只截取屏幕截图,因为这似乎是Permission Guidelines for Google Maps特别禁止的。
但是,我需要防止作弊者 - 你必须传递google.maps.LatLng和缩放级别to the map constructor,这意味着作弊用户只需要查看来源以获取此数据:
<script type="text/javascript"
src="http://maps.google.com/maps/api/js?sensor=false"></script>
<script type="text/javascript">
function initialize() {
var myOptions = {
center: new google.maps.LatLng(55, 145), /* this */
zoom: 10, /* and possibly this */
mapTypeId: google.maps.MapTypeId.SATELLITE,
}
var map = new google.maps.Map(document.getElementById("map_canvas"),
myOptions);
}
</script>
我已经在不破坏地图(例如center
和操作函数如setZoom()
)的情况下取消了我可能的每一个值,并在匿名函数中初始化地图(因此对象不是在全局命名空间中可见。)
现在,这当然是浏览器,客户端,不受信任的JavaScript;我已经阅读了obfuscation标签的大部分内容,而我并没有尝试使脚本具有防弹性(毕竟它只是一个游戏)。 我只需要对1337 Java5kryp7 haxz0rz - “小妹妹加密”进行混淆,正如Bruce Schneier所说的那样。任何比base64编码更难的东西都会通过消除most cheaters来阻止lowest-hanging fruit - 如果骗子很聪明并且确定足以使用JS调试器,他可以绕过我能做的任何事情(因为我需要传递值)以明文形式提供给Google Maps API,但这不大可能发生(也会有其他与代码无关的方法来防止作弊)。
我已经尝试various minimizers和obfuscators,但这些代码主要处理代码(在这种情况下不是“秘密”),变量的值仍然是逐字显示。
在@Pointy的建议中,我仔细检查了HTTP请求,其中一个确实发送了URL中的lat / lon;虽然这令人失望,但这个请求发生在许多其他请求之间,所以它不会立即被注意到。幸运的是,目标只是让更难找到纬度/经度,而不是防弹。
TL; DR:我需要在JavaScript中混淆三个值。我不是在寻找防弹衣,只是打喷嚏。我该怎么用?
答案 0 :(得分:1)
最好混淆整个代码库,而不仅仅是缩小代码。这样,用户很难知道哪个变量可以查找纬度/经度值。
Dojo Toolkit可以在高级模式下与Closure Compiler一起使用,以进行完全混淆。如果您使用JavaScript库但需要混淆整个代码以保护您的IP,您应该考虑使用Dojo。
答案 1 :(得分:0)
不要浪费你的时间陪伴。压缩代码(yuic,closure)并完成它。正如你所说的那样,代码运行@client方面,没有任何意义可以阻止任何事情。
例如,像这样:
for (var secret = 0; secret < 10; secret++) {
alert(secret);
}
进入'关闭':
for(var a=0;a<10;a++)alert(a);
你可以玩closure online
如果您想明确“隐藏”数据段:以某种形式压缩/'加密',JavaScript implementation of Gzip可能有助于此。