V2EX = way to explore
V2EX 是一个关于分享和探索的地方
现在注册
已注册用户请  登录
V2EX 提问指南
scriptB0y
V2EX  ›  问与答

js 向后端提交 ajax 请求,但是避免用户模拟 HTTP 上传虚假数据的思路?

  •  
  •   scriptB0y · 2018-12-26 10:24:10 +08:00 · 2377 次点击
    这是一个创建于 2177 天前的主题,其中的信息可能已经有所发展或是发生改变。

    场景:

    JS 游戏在游戏结束后上传分数,但是如果用 HTTP 请求的话,用户可以随意 POST 一个分数。

    如果用 JS 加密,server 解密的话,用 Chrome 调试是否也可以随意改写一个值上传上去?

    12 条回复    2018-12-26 13:48:38 +08:00
    gam2046
        1
    gam2046  
       2018-12-26 10:33:26 +08:00   ❤️ 1
    原则上没有办法,只有记录客户端的行为数据,服务端判断是否可行。

    https://www.google.com/recaptcha/admin#list

    可以尝试 v3 版本的 reCaptcha,是完全无侵入性,而且国内可直接使用。
    ByZHkc3
        2
    ByZHkc3  
       2018-12-26 10:35:10 +08:00
    这就是涉及到游戏反作弊的处理里,每次游戏生成一个游戏 id,可以在游戏中途上发数据,post 数据的时候可以依据游戏时间及分数上限来判断用户是否作弊
    nfroot
        3
    nfroot  
       2018-12-26 11:38:27 +08:00
    用户端发来的任何数据都不可信任,都是可以伪造的,服务器端必须有机制去确认它合不合规,每隔一个时间发一个数据确认也是一个方式。


    但是。。。。客户端也可以伪造。


    所以重要的东西都是服务器去做运算而不是客户端。

    一般都是通过行为去判断。
    TomVista
        4
    TomVista  
       2018-12-26 11:47:14 +08:00
    ```
    function(){
    ...
    }()
    ```
    GDC
        5
    GDC  
       2018-12-26 12:05:49 +08:00 via iPhone
    无解,分数在服务端计算
    hongshaoyuancn
        6
    hongshaoyuancn  
       2018-12-26 13:17:36 +08:00
    最近也在想 前端根据后端提供的密钥加上时间戳进行签名 保证签名唯一性的情况下 将数据带入后端校验唯一签名通过 其他的全部拒绝 准备试试呢。。。。。。。。。。
    maichael
        7
    maichael  
       2018-12-26 13:26:47 +08:00
    @hongshaoyuancn #6 只要你前端能做的,别人也可以模拟这一过程。
    maichael
        8
    maichael  
       2018-12-26 13:31:56 +08:00   ❤️ 1
    可以看下之前 LeanCloud 做小游戏的思路: https://zhuanlan.zhihu.com/p/52864161
    t6attack
        9
    t6attack  
       2018-12-26 13:32:31 +08:00
    如果解密分析的难度过大,控制台破不了、抓包篡改数据破不了。。那我干脆用 CE 修改器直接改内存。
    Mazexal
        10
    Mazexal  
       2018-12-26 13:34:35 +08:00
    想想之前微信跳一跳刷分数的, 直接通过接口更新直接就炸了
    scriptB0y
        11
    scriptB0y  
    OP
       2018-12-26 13:45:11 +08:00
    @gam2046 这个我想过,跟你想法一样。客户端的游戏我用一种 hash 算法计算出得出:游戏时间、游戏操作 最后得到的游戏分数,然后客户端计算一个 hash 值带上。验证如 P 问题和 NP 问题一样,验证这个 hash 值很快。

    @hongshaoyuancn 客户端既然拿到了秘钥,那用户总看得见啊,大不了用浏览器把你的加密算法跑一下也是正确的。

    @Mazexal 微信是怎么做的呢?不暴露客户端代码 + 通过加密的 TCP 传输防止抓包?
    scriptB0y
        12
    scriptB0y  
    OP
       2018-12-26 13:48:38 +08:00
    @maichael 谢谢 看了一下也是记录中途游戏参数+参数校验。这个摸透了校验规则也是可以伪造 “稍微高于正常水平”的游戏数据的,至于离线分析,也是看游戏数据是否合理吧。感觉没有本质上解决这个问题呢。
    关于   ·   帮助文档   ·   博客   ·   API   ·   FAQ   ·   实用小工具   ·   5031 人在线   最高记录 6679   ·     Select Language
    创意工作者们的社区
    World is powered by solitude
    VERSION: 3.9.8.5 · 32ms · UTC 09:03 · PVG 17:03 · LAX 01:03 · JFK 04:03
    Developed with CodeLauncher
    ♥ Do have faith in what you're doing.