gpt4 book ai didi

javascript - 确保从用于Javascript游戏的正确服务器上验证检索到的JSON

转载 作者:行者123 更新时间:2023-12-03 12:42:22 25 4
gpt4 key购买 nike

我目前正在尝试为一种简单的Javascript游戏建立一种技术,以验证服务器中的某些数据。我了解尝试保护Javascript应用程序会遇到很多问题,因为按照定义,所有代码都可以在客户端使用。

例如,如果是游戏,则:

  var playerScore = 100

阻止人们简单地编辑Javascript并像这样运行它...
  var playerScore = 10000000

...我将在服务器上对其进行验证。但是,(对我而言)这似乎只是增加了一个非常琐碎的额外步骤来破解游戏。黑客\tweaker不能只是将我的Ajax请求的目的地更改为他们自己的本地文件吗?

我考虑过可能要尝试比较一些常见值的动态 key \加密,例如日期,在客户端和服务器之间,但是同样,加密方法将是可见的,因此可以避免。

我知道这是一个非常广泛的主题,但是任何人都可以推荐一些最佳实践吗?我已经看过这篇文章( Prevent Javascript games tweaking/hacking),它对于防止某些篡改非常有帮助,但是我不确定如何验证是否进行了正确的服务器端验证。

与往常一样,在此先感谢您。

最佳答案

要直接回答您的问题:

Q - "Couldn't the hacker\tweaker just change the destination of my Ajax request to their own local files?"



A -如果您的脚本没有被混淆,则可以更改AJAX请求目的地以使用自己的游戏服务器。甚至可以解开混淆的脚本来更改黑客游戏的请求目的地,但是这样做的含义是什么?他们将拥有自己版本的游戏来做自己的事情,与自己的服务器交谈……除非客户端游戏中存在要解锁的 secret ,否则这几乎不是真正的问题,拥有自己的服务器可能比这些 secret 更容易被发现。只是阅读客户资料。

但是,游戏服务器可以保护游戏 secret ,但可以在游戏过程中将这些 secret 作为脚本有效内容丢弃...在这种情况下,您需要继续阅读。

Q - I know this is a very broad subject, but are there any best practices that you anyone can recommend? ... I'm not sure about how to verify the correct server-side validation is taking place.



A -为了防止在 游戏服务器上伪造游戏状态和统计信息,我不认为这是您要问的...我相信您正在询问如何防止 游戏客户端来自拥有错误的游戏状态,这是不可能的,一旦客户端代码离开您的服务器就可以对其进行篡改,并且任何阻止措施也将包含在客户端代码中,并且自然而然地是可逆的,因此可以避免...

防止黑客入侵游戏服务器统计信息的对策

假设客户端是当前游戏分数的授权者,并且服务器未运行游戏 session 的权威版本,并且未从客户端接收用户输入更新(在这种情况下,用户输入仅需要清理,但会引入复杂性)该状态需要从服务器同步到客户端,并且对延迟问题很敏感)。

通常,似乎没有一个完美的解决方案可以完全缓解黑客攻击,更不用说一个JavaScript游戏了,例如在已编译的Flash中,这个问题仍然很明显: What is the best way to stop people hacking the PHP-based highscore table of a Flash game,即使在系统的可执行级别上也是如此: How can I protect my .NET assemblies from decompilation?

JavaScript不会被编译,而是以纯文本格式发送,因此它没有这些(可避免的)黑客入侵障碍。

我从链接的各种资源和一些Google搜索中找到了一种缓解此问题的方法,我的游戏是:
var score = 0;
function increaseScore() {
score ++;
sendScore();
}
function sendScore() {
// Ajax
}
function run() {
setTimeout(function() {
increaseScore();
}, 1000);
}
run();
  • 闭包:在正在运行的代码周围使用闭包将防止通过浏览器控制台调用函数和变量。它不能防止断点,也不能简单地修改脚本以删除闭包。
    (function() {
    var score = 0;
    function increaseScore() {
    score ++;
    sendScore();
    }
    function sendScore() {
    // Ajax
    }
    function run() {
    setTimeout(function() {
    increaseScore();
    }, 1000);
    }
    run();
    }) ();
  • 混淆:您可以使用Dean Edwards压缩程序,也可以使用闭包编译器之类的代码来简化代码。缩小不会阻止通过浏览器控制台监视和更改变量,但是两者都会阻止源易于人类阅读,这对于黑客找到要监视的明智断点是必不可少的。

    教务长爱德华兹打包机将脚本转换为字符串,并对其进行评估,从而无法在原始脚本中添加断点。但是,可以解压缩脚本,让黑客使用此脚本代替添加断点。
    eval(function(p,a,c,k,e,r){e=String;if(!''.replace(/^/,String)){while(c--)r[c]=k[c]||c;k=[function(e){return r[e]}];e=function(){return'\\w+'};c=1};while(c--)if(k[c])p=p.replace(new RegExp('\\b'+e(c)+'\\b','g'),k[c]);return p}('(1(){6 2=0;1 3(){2++;4()}1 4(){}1 5(){7(1(){3()},8)}5()})();',9,9,'|function|a|increaseScore|sendScore|run|var|setTimeout|1000'.split('|'),0,{}))
  • 加密:,客户端在发送之前对分数进行加密,如果黑客可以访问加密功能,这将不会阻止通过浏览器调试器修改分数,但会阻止服务器请求中分数的简单伪造。
  • 游戏实例 token :服务器在请求中包含唯一 token ,该 token 在游戏开始时发送回服务器。这样可以防止对脚本进行简单的修改(如在解包或删除闭包时),因为实例标记已被原始脚本使用,从而使脚本无效。

    确定的黑客将需要删除发回 token 的代码来解决此问题,他们还需要确保从逻辑上从原始游戏实例中获取发回的分数(请参阅步骤6),并使之复杂得多。第5步)。
    (function() {   
    var score = 0;
    var token = "abcdef123456789"; // Inserted by server side code
    function increaseScore() {
    score ++;
    sendScore();
    }
    function sendScore() {
    var encrypted = encryptScore();
    // Ajax send encrypted
    }
    function encryptScore() {
    // Uses some encryption lib
    }
    function sendToken() {
    // Ajax send token
    }
    function run() {
    sendToken();
    setTimeout(function() {
    increaseScore();
    }, 1000);
    }
    run();
    }) ();
  • 计分 token :服务器为下一个要加密的乐谱发送一个 token 。这样可以减小攻击窗口的大小。如果黑客找到了加密分数以发送的代码,他们仍然需要获取当前分数更新的正确 token 。
    (function() {   
    var score = 0;
    // Yes it would be easy to simply add items onto this queue
    // the closure and packing to prevent breakpoints, plus the
    // session token are required to prevent this
    var queue = [];
    var token = "abcdef123456789"; // Inserted by server side code
    var sending = false;
    function increaseScore() {
    score ++;
    queue.push(score);
    if(!sending)
    sendScores();
    }
    // Scores now need to be sent sequentially, the last
    // score sent response will have the next scores token
    function sendScores() {
    sending = true;
    var encrypted = encryptScore(queue.shift(), token);
    // Ajax send encrypted, send next score when
    // response received, if there is a next score
    // in the queue, otherwise stop sending
    // (sending = false)
    }
    function encryptScore(score, token) {
    // Uses some encryption lib
    }
    function sendToken(callback) {
    // Ajax send token, sets new token value from server response
    }
    function run() {
    sendToken(function() {
    setTimeout(function() {
    increaseScore();
    }, 1000);
    });
    }
    run();
    }) ();
  • 服务器端感知检查:服务器检查用户的分数增加幅度是否超出了可能的范围(或在上面重用实例 token 的情况下甚至降低了),这可能也是顺序分数更新的步骤太过分,不合逻辑或分数在给定时间段内增长过快。
  • 黑名单:隔离显示欺诈行为的用户和 session ,以使黑客看不到他们已经被发现并且其分数已从有效分数池中悄悄删除。
  • 灰名单:标记似乎非常接近理想计分方案的用户或游戏 session ,以供人工调查以决定是否将其列入黑名单。

  • 通常,我将创建尽可能多的审核数据以尝试监视情况,在必要时手动进行干预,并在现场情况再次出现问题时添加更多的预防措施。

    同样,由于没有完美的解决方案来解决这个问题,因此仅仅是要使其变得困难,以至于不值得破解它所需要的时间。总是有顽固的黑客可以挑战,但要保持正确的眼光:如果黑客确实设法采用当前的对策来破解分数,那将是什么结果,这值得您花时间来规避吗?

    猜测商业游戏生产商会使用本书中的大多数技巧,但是即使如此,这也将取决于预算与风险。

    关于javascript - 确保从用于Javascript游戏的正确服务器上验证检索到的JSON,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/16633770/

    25 4 0
    Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
    广告合作:1813099741@qq.com 6ren.com