如题,前端新人,我做了一个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加成绩加时间再自己哈希了一起发过来不就无视了这个验证么?
Copyright 2014-2025 https://www.php.cn/ All Rights Reserved | php.cn | 湘ICP备2023035733号
1 是, 浏览器内玩的甚至不需要用更下层的工具, 你玩一下浏览器的开发工具就知道了
2 那个例子中加个md5能让不知道怎么算的人没法伪造
但是这样的checksum是完全在别人机器上算出来的, 别人逆向了也就知道怎么算了, 只是能增加伪造成本, 没更高的保证.
前端代码的验证都可以绕过,所以后端必须要验证一次。但这仅仅对格式验证有效,对于你说的这种数据篡改验证,由于前端暴露了算法,后端怎么验证都没用的。
要不然微信web版的接口是怎么破解的?安卓应用的各种接口,只要是oauth都带个md5验证,不照样能逆出来吗。
只要分数是有前端生成的, 是没有办法防的, md5加密也只能防菜鸟, 懂js, md5加密也是没用的
一般来说md5加密是 MD5(id+分数+一段特殊字符) 用js加密, "一段特殊字符"是可以看到的, 别人完全可以伪造
没用的。………
关键词: csrf 或 xsrf
你的数据是js生成,所以即使使用摘要也只能保证数据的完整性,这里涉及的数据防伪造性,除非你能避免直接有请求发送数据而是由后端代码计算生成,否则在浏览器端就可以把数据修改,或者利用burp等工具都可以劫持并修改请求和返回数据
玩游戏的过程中时刻与服务器保持心跳~~~