javascript - 前端代码是不是可以随意被人修改的?
迷茫
迷茫 2017-04-10 16:55:10
[JavaScript讨论组]

如题,前端新人,我做了一个WEB小游戏,在游戏开始和结束时获取时间戳相减最后post给后台,关于验证有几个方面的疑惑。相关代码的雏形如下:
前端代码:

var score=Math.round((performance.now()-currentGame.sTime)/100)/10;
            $.ajax({
                url:"test.php",
                type:"POST",
                data:{name:"123",
                    score:score
                },
                dataType:"json",
                error:function(){
                    alert("数据返回失败!");
                },
                success: function(data,testStatus){
                    alert("数据返回成功");
                    if(!data.count){
                        $rankList.html("玩家不存在,创造了个人新纪录:"+data.score);
                    }
                    else if(data.score<data.record)
                    {
                        $rankList.html("玩家存在,创造了个人新纪录:"+data.score);}
                    else{
                        $rankList.html("玩家存在,个人最佳纪录:"+data.record+"。继续加油吧!");}
                }
            });

后端代码:

<?php
$dsn = 'mysql:dbname=rank;host=localhost';
$user='root';
$psw='123456';
try{
    $dbh=new PDO($dsn,$user,$psw);
 }
 catch(PDOException $e){
 echo '数据库连接失败'.$e->getMessage();
 }
$dbh->setAttribute(PDO::ATTR_EMULATE_PREPARES, false);
 $stmt=$dbh->prepare("select * from scoreRank where name=?");
 $name=$_POST['name'];
 $score=$_POST['score'];
 $stmt->bindParam(1,$name);
 $stmt->execute();
 $count = $stmt->rowCount();
 $row=$stmt->fetch(PDO::FETCH_ASSOC);
 $record=$row['score'];
 $list=array("count"=>$count,"score"=>$score,"record"=>$record);
 echo json_encode($list);

1.是不是一个网页前端的JS是可以随意被人修改?也就是说是不是任何人都可以随意向后台提交任意数据,是通过拦截数据包修改数据内容还是说自己可以随意的POST数据?我的JS文件中的每个变量的值是不是完全可以被查看的?
2.我的后台验证的思路应该是怎样的?
我查找了一点相关资料http://bbs.blueidea.com/thread-3063778-1-1.html有人说:

以前我们在Facebook做过一个小游戏的APP。也遇见篡改分数的人了。但是我们就用了一招就解决了。 MD5加密 明文和密文一起发 例如:
小游戏ID+分数+时间的字符串用MD5加密后和小游戏ID+分数+时间戳的字符串一起发给服务器,例如
001+23411+20120620152449&123cqr312rn12nf2u1fu1
服务器只需要把明文再次加密后比对就好了例如001+23411+20120620152449加密后得到的是123cqr312rn12nf2u1fu1就是对的,不是的就返回一行字,请不要作弊。

至于MD5的内容你肯定是保密的。至于怎么保密就不用我教了把?
最后这句关于这个MD5的内容是怎么保密的,不是太懂。如果第一个问题中某个作弊者可以随意发送请求,他自己伪造一个ID加成绩加时间再自己哈希了一起发过来不就无视了这个验证么?

迷茫
迷茫

业精于勤,荒于嬉;行成于思,毁于随。

全部回复(7)
PHP中文网

1 是, 浏览器内玩的甚至不需要用更下层的工具, 你玩一下浏览器的开发工具就知道了

2 那个例子中加个md5能让不知道怎么算的人没法伪造
但是这样的checksum是完全在别人机器上算出来的, 别人逆向了也就知道怎么算了, 只是能增加伪造成本, 没更高的保证.

PHPz

前端代码的验证都可以绕过,所以后端必须要验证一次。但这仅仅对格式验证有效,对于你说的这种数据篡改验证,由于前端暴露了算法,后端怎么验证都没用的。

要不然微信web版的接口是怎么破解的?安卓应用的各种接口,只要是oauth都带个md5验证,不照样能逆出来吗。

PHP中文网

只要分数是有前端生成的, 是没有办法防的, md5加密也只能防菜鸟, 懂js, md5加密也是没用的

一般来说md5加密是 MD5(id+分数+一段特殊字符) 用js加密, "一段特殊字符"是可以看到的, 别人完全可以伪造

黄舟

没用的。………

迷茫

关键词: csrf 或 xsrf

高洛峰

你的数据是js生成,所以即使使用摘要也只能保证数据的完整性,这里涉及的数据防伪造性,除非你能避免直接有请求发送数据而是由后端代码计算生成,否则在浏览器端就可以把数据修改,或者利用burp等工具都可以劫持并修改请求和返回数据

高洛峰

玩游戏的过程中时刻与服务器保持心跳~~~

热门教程
更多>
最新下载
更多>
网站特效
网站源码
网站素材
前端模板
关于我们 免责申明 意见反馈 讲师合作 广告合作 最新更新 English
php中文网:公益在线php培训,帮助PHP学习者快速成长!
关注服务号 技术交流群
PHP中文网订阅号
每天精选资源文章推送
PHP中文网APP
随时随地碎片化学习
PHP中文网抖音号
发现有趣的

Copyright 2014-2025 https://www.php.cn/ All Rights Reserved | php.cn | 湘ICP备2023035733号