首页 新闻 会员 周边 捐助

发送请求的时候有哪些方式防止用户篡改数据?

2
悬赏园豆:50 [已解决问题] 解决于 2015-09-08 16:58

客户端产生了一堆数据之后(一般不是用户填写的了,可能使用js计算的),需要提交到后台,

这个过程中,总是有被某些搞技术的用户截取了,然后修改了,针对这个问题------

客户端的数据传递到服务器的过程,各位大神有什么好的处理方法吗?

 

(https这种方式暂时没有什么可行性了)

给我一个理由的主页 给我一个理由 | 初学一级 | 园豆:17
提问于:2015-09-07 14:35
< >
分享
最佳答案
1

将要提交的参数先做加密,然后把加密的信息做一次md5摘要,也就是签名,然后把摘要连同参数一起回传给服务器,服务器拿到参数后,同样的方式加密做md5摘要,然后两个摘要做对比,如果不相等参数便是被篡改了,否则可信。这种方式已经是很成熟的url参数防篡改技术了,简单易用成本低,安全系数高,并且不会大大增加url的长度,业内很多公司都在使用这种方式,比如阿里巴巴,腾讯的接口等。希望可以帮助到你。

收获园豆:30
Jared.Nie | 小虾三级 |园豆:1940 | 2015-09-07 15:10

你说的我基本能明白了,确实不错哟.

但是如果在js中被看到md5加密的话,截取数据的人也用同样的方法来一遍的话,是不是就没有办法了呢?

给我一个理由 | 园豆:17 (初学一级) | 2015-09-07 16:44

@给我一个理由: 通常情况下做md5肯定不能在最前端做,否则下载你的js,什么密钥什么key那就没有意义了,web端组织好了参数,发送到后端,然后由后端md5摘要后,再发送到后端,其实这些要看你的系统结构是怎么样的,并不是一蹴而就的,是要根据你的做分析的。如果非要把md5放到js也不是不可以,只是需要把js进行加密压缩的。

Jared.Nie | 园豆:1940 (小虾三级) | 2015-09-07 17:21
其他回答(6)
0

这个问题好哦

唯我独萌 | 园豆:537 (小虾三级) | 2015-09-07 14:49
0

数据都是在后台计算,重要数据都是后台自己从数据库查询出来,都不能用js处理传递这些值的。

悟行 | 园豆:12559 (专家六级) | 2015-09-07 15:01
3

永远不要相信客户端提交的数据就行了。

收获园豆:5
爱编程的大叔 | 园豆:30844 (高人七级) | 2015-09-07 15:03
2

https为什么会没有可行性...

md5校验如果是从前端传到后台是不现实的.原因你自己也说了.

而且你的用户修改是在传输之前修改的吧,如果是用户要修改发送的数据是无解的,所有的安全手段都是保证用户发送给服务端的数据不被第三方修改.用户自己当然能决定发什么数据给你服务端.

这种需求你要做的是在服务端做数据正确性校验..而不是保障传输安全

收获园豆:14
吴瑞祥 | 园豆:29449 (高人七级) | 2015-09-07 17:23

从web端到后端的数据传输主要工作是做好校验,因为从web到后端根本就不能防篡改,而且这一阶段的篡改几乎没有意义,举个最简单的例子  比如http://www.abc.com/?username=admin&password=123 POST方式提交过去,篡改了顶多就是登陆不了,没有任何意义,而且大部分系统在业务逻辑层(BLL)都会针对数据做校验的。

其实这个问题本身就涉及了几个话题,比如安全传输,数据校验,数据加密等话题。所以要真把这个话题说透了,还真不是一句两句的事。说的不对请指正。

支持(0) 反对(0) Jared.Nie | 园豆:1940 (小虾三级) | 2015-09-07 17:46

@Jared.Nie, @ 吴瑞祥:这个悲伤的故事源于一次这样的开发经历,不久前我开发了一个在微信上的接力跑的游戏,就是通过用户点击之后得到一堆json数据(包括成绩...)然后发送到后台保存,当时没有做任何的加密处理,

然后不久之后就出现了各种不可能的数据,我自己也利用fiddler尝试调试一个捕获的请求然后修改数据,居然也保存成功了,所以你们说这个数据用户能随便修改吗?怎么会没有影响哦.所以特地来求个对策

这个是之前的测试地址:

或者说我整个思路是有问题的?

是否这个东西也是可以不从客户端来发送数据的呢?

支持(0) 反对(0) 给我一个理由 | 园豆:17 (初学一级) | 2015-09-07 18:33

@给我一个理由: 整个思路是有问题的。

支持(0) 反对(0) 爱编程的大叔 | 园豆:30844 (高人七级) | 2015-09-08 08:04

@爱编程的大叔: 那么大叔啊,你能大概说下如果你来开发,会是什么思路吗?要不强烈不服啊!

支持(0) 反对(0) 给我一个理由 | 园豆:17 (初学一级) | 2015-09-08 08:15

@给我一个理由: 上面的例子里,你做的事情并不是篡改请求。。而是发送修改后报文。很多基本思路都有问题。。

篡改请求说的是,客户端发出正确的报文,在路由过程中,报文信息被修改也就是说服务端收到的报文与客户端发出的不一致。你的情况是服务端接收到的报文就是客户端发出的。只是客户端要给你发送错误报文。

你的需求是如何不让客户端给你发送你认为的错误报文。再重复一遍!这是不可能的!!

支持(2) 反对(0) 吴瑞祥 | 园豆:29449 (高人七级) | 2015-09-08 09:05

@吴瑞祥: 的确,不可否认

那么你的思路能说下嘛?

(最开始我曾经是用户每次点击就请求一次后台,然后将数据返回前台显示(当然你可以优化成每点击好几次来减少ajax的请求),主要这样做的缺点是,手机使用gprs访问的时候,整个过程会变得卡的不得了...所以最终只能选择用js获取结果然后发送到后台,你能告诉我除了这种意外,你还能想到其他的嘛?网络因素...)

支持(0) 反对(0) 给我一个理由 | 园豆:17 (初学一级) | 2015-09-08 09:13

@给我一个理由: 不行的。没有可行性,你想想别的游戏就知道了。我是没见过web游戏有不能改的。

支持(0) 反对(0) 吴瑞祥 | 园豆:29449 (高人七级) | 2015-09-08 09:21

@吴瑞祥: 你不能一棍子打死啊....

支持(0) 反对(0) 给我一个理由 | 园豆:17 (初学一级) | 2015-09-08 09:23

@给我一个理由: 需求是如何不让客户端给你发送你认为的错误报文,如果你的需求是这个,并且是在web里。那是没可能的。你可以用js加密数据并且吧加密算法多包几层,但是再怎么包都不能说他是安全的,只能说他是比较安全。

支持(2) 反对(0) 吴瑞祥 | 园豆:29449 (高人七级) | 2015-09-08 09:30

@吴瑞祥: js的确是一条可以尝试的路

支持(0) 反对(0) 给我一个理由 | 园豆:17 (初学一级) | 2015-09-08 09:32

@给我一个理由: 我来开发的话,你的需求没说明清楚。

我只知道一点,符合不符合逻辑就行。

吴瑞祥和幻天芒说的都是这事。你的错误不至于技术,就在于逻辑。

技术只能解决能解决的问题,不能解决不能解决的问题。(也许有点绕,但事实如此)

支持(1) 反对(0) 爱编程的大叔 | 园豆:30844 (高人七级) | 2015-09-08 09:45

@爱编程的大叔: 高实在是高

你说的好有道理,我竟然无言以对

支持(0) 反对(1) 给我一个理由 | 园豆:17 (初学一级) | 2015-09-08 11:48

@给我一个理由: 没有啥高不高的,你要么相信要么不信客户端的数据,加密或者校验也是需要有两个数据才能校验的,服务端数据,客户端数据,期初数据,发生数据,期末数据,类似财务的Transaction,你如果有这个机器性能的话,你就慢慢判断好了,无非就是让作假的成本提高而已。

要么就是别相信客户端的数据。

支持(0) 反对(0) 爱编程的大叔 | 园豆:30844 (高人七级) | 2015-09-08 11:58
0

不关心数据来源,关注数据的正确性。重点在对数据的验证上。。

收获园豆:1
幻天芒 | 园豆:37207 (高人七级) | 2015-09-08 09:25

特定的情况下,这种想法是错误的,比如我们客户的需求就是严防作弊,就算我后台设置一个最大值来验证比如说超过200 就报错,又有何用,人家作弊一样可以刷成绩199啊...

支持(0) 反对(0) 给我一个理由 | 园豆:17 (初学一级) | 2015-09-08 09:30

@给我一个理由: http无状态,你判断不了。你说的这种情况,不应该是客户端提交成绩,成绩应该在后台算好。

支持(0) 反对(0) 幻天芒 | 园豆:37207 (高人七级) | 2015-09-08 09:42

@幻天芒: :你可以看下上面回答最多的一个

支持(0) 反对(0) 给我一个理由 | 园豆:17 (初学一级) | 2015-09-08 09:44

@给我一个理由: 没看明白你想传达什么。由于http本身的特点,用户截取请求无法做到。你要做的是,验证来的数据的合法性(数据格式,类目等)。

支持(0) 反对(0) 幻天芒 | 园豆:37207 (高人七级) | 2015-09-08 12:21
0

mark..

感觉 | 园豆:202 (菜鸟二级) | 2018-01-12 11:52
清除回答草稿
   您需要登录以后才能回答,未注册用户请先注册