客户端产生了一堆数据之后(一般不是用户填写的了,可能使用js计算的),需要提交到后台,
这个过程中,总是有被某些搞技术的用户截取了,然后修改了,针对这个问题------
客户端的数据传递到服务器的过程,各位大神有什么好的处理方法吗?
(https这种方式暂时没有什么可行性了)
将要提交的参数先做加密,然后把加密的信息做一次md5摘要,也就是签名,然后把摘要连同参数一起回传给服务器,服务器拿到参数后,同样的方式加密做md5摘要,然后两个摘要做对比,如果不相等参数便是被篡改了,否则可信。这种方式已经是很成熟的url参数防篡改技术了,简单易用成本低,安全系数高,并且不会大大增加url的长度,业内很多公司都在使用这种方式,比如阿里巴巴,腾讯的接口等。希望可以帮助到你。
你说的我基本能明白了,确实不错哟.
但是如果在js中被看到md5加密的话,截取数据的人也用同样的方法来一遍的话,是不是就没有办法了呢?
@给我一个理由: 通常情况下做md5肯定不能在最前端做,否则下载你的js,什么密钥什么key那就没有意义了,web端组织好了参数,发送到后端,然后由后端md5摘要后,再发送到后端,其实这些要看你的系统结构是怎么样的,并不是一蹴而就的,是要根据你的做分析的。如果非要把md5放到js也不是不可以,只是需要把js进行加密压缩的。
这个问题好哦
数据都是在后台计算,重要数据都是后台自己从数据库查询出来,都不能用js处理传递这些值的。
永远不要相信客户端提交的数据就行了。
https为什么会没有可行性...
md5校验如果是从前端传到后台是不现实的.原因你自己也说了.
而且你的用户修改是在传输之前修改的吧,如果是用户要修改发送的数据是无解的,所有的安全手段都是保证用户发送给服务端的数据不被第三方修改.用户自己当然能决定发什么数据给你服务端.
这种需求你要做的是在服务端做数据正确性校验..而不是保障传输安全
从web端到后端的数据传输主要工作是做好校验,因为从web到后端根本就不能防篡改,而且这一阶段的篡改几乎没有意义,举个最简单的例子 比如http://www.abc.com/?username=admin&password=123 POST方式提交过去,篡改了顶多就是登陆不了,没有任何意义,而且大部分系统在业务逻辑层(BLL)都会针对数据做校验的。
其实这个问题本身就涉及了几个话题,比如安全传输,数据校验,数据加密等话题。所以要真把这个话题说透了,还真不是一句两句的事。说的不对请指正。
@Jared.Nie, @ 吴瑞祥:这个悲伤的故事源于一次这样的开发经历,不久前我开发了一个在微信上的接力跑的游戏,就是通过用户点击之后得到一堆json数据(包括成绩...)然后发送到后台保存,当时没有做任何的加密处理,
然后不久之后就出现了各种不可能的数据,我自己也利用fiddler尝试调试一个捕获的请求然后修改数据,居然也保存成功了,所以你们说这个数据用户能随便修改吗?怎么会没有影响哦.所以特地来求个对策
这个是之前的测试地址:
或者说我整个思路是有问题的?
是否这个东西也是可以不从客户端来发送数据的呢?
@给我一个理由: 整个思路是有问题的。
@爱编程的大叔: 那么大叔啊,你能大概说下如果你来开发,会是什么思路吗?要不强烈不服啊!
@给我一个理由: 上面的例子里,你做的事情并不是篡改请求。。而是发送修改后报文。很多基本思路都有问题。。
篡改请求说的是,客户端发出正确的报文,在路由过程中,报文信息被修改也就是说服务端收到的报文与客户端发出的不一致。你的情况是服务端接收到的报文就是客户端发出的。只是客户端要给你发送错误报文。
你的需求是如何不让客户端给你发送你认为的错误报文。再重复一遍!这是不可能的!!
@吴瑞祥: 的确,不可否认
那么你的思路能说下嘛?
(最开始我曾经是用户每次点击就请求一次后台,然后将数据返回前台显示(当然你可以优化成每点击好几次来减少ajax的请求),主要这样做的缺点是,手机使用gprs访问的时候,整个过程会变得卡的不得了...所以最终只能选择用js获取结果然后发送到后台,你能告诉我除了这种意外,你还能想到其他的嘛?网络因素...)
@给我一个理由: 不行的。没有可行性,你想想别的游戏就知道了。我是没见过web游戏有不能改的。
@吴瑞祥: 你不能一棍子打死啊....
@给我一个理由: 需求是如何不让客户端给你发送你认为的错误报文,如果你的需求是这个,并且是在web里。那是没可能的。你可以用js加密数据并且吧加密算法多包几层,但是再怎么包都不能说他是安全的,只能说他是比较安全。
@吴瑞祥: js的确是一条可以尝试的路
@给我一个理由: 我来开发的话,你的需求没说明清楚。
我只知道一点,符合不符合逻辑就行。
吴瑞祥和幻天芒说的都是这事。你的错误不至于技术,就在于逻辑。
技术只能解决能解决的问题,不能解决不能解决的问题。(也许有点绕,但事实如此)
@爱编程的大叔: 高实在是高
你说的好有道理,我竟然无言以对
@给我一个理由: 没有啥高不高的,你要么相信要么不信客户端的数据,加密或者校验也是需要有两个数据才能校验的,服务端数据,客户端数据,期初数据,发生数据,期末数据,类似财务的Transaction,你如果有这个机器性能的话,你就慢慢判断好了,无非就是让作假的成本提高而已。
要么就是别相信客户端的数据。
不关心数据来源,关注数据的正确性。重点在对数据的验证上。。
特定的情况下,这种想法是错误的,比如我们客户的需求就是严防作弊,就算我后台设置一个最大值来验证比如说超过200 就报错,又有何用,人家作弊一样可以刷成绩199啊...
@给我一个理由: http无状态,你判断不了。你说的这种情况,不应该是客户端提交成绩,成绩应该在后台算好。
@幻天芒: :你可以看下上面回答最多的一个
@给我一个理由: 没看明白你想传达什么。由于http本身的特点,用户截取请求无法做到。你要做的是,验证来的数据的合法性(数据格式,类目等)。
mark..