我正在做一个网页商城的项目.现在在验证签名这里遇到了一些问题,希望各位前辈能给予提示或者指正.现在是不知道如何保证服务器接收请求是由正确的用户发出的,而不是伪造的?我现在的想法是这样的,每个url后面都加上当前的时间戳和sign值,在请求中作为参数发送给服务器.服务器首先判断时间戳,如果距离当前时间超过10分钟则判断这个请求已经过期,需要重新发送请求.但是我不知道前端的sign值如何获取.以前做app的时候,sign可以按照MD5(订单号+用户ID+时间戳+其他盐)的方式,在app内部完成,外部无法看到具体的加密方法.但是现在这个前端几乎全部是开放的,用JS做加密别人也能看到.我也想让前端直接从服务器获取现成的sign签名和时间戳,但是同样的.这个请求sign签名的url也无法验证用户的唯一性,数据的准确性.别人改下url中的订单号,照样能拿到对应的sign值.那么,这种前端验证到底该怎么做呢?

解决方案 »

  1.   

    和你做app一样的道理,sign是通过php程序生成的,不是js
    前端可以看到的只是sign的一串字符,但前端浏览的人不知道这串字符 和 订单号的转换方法,如果前端某人改了sign值,同时改了订单号,在后端验证的时候 肯定通不过的。
    比如 PHP生成的页面 a.php?order=123&time=456&sign=abcdef
    别人知道这个地址,他可以改order和sign,但改了之后,后端接收判断肯定验证不过,因为他不知道order和sign之间的关系
      

  2.   


    谢谢解惑.但是我还是有点不明白的地方.照您所说,sign值是php后台生成的,那应该也是需要后台把这个sign值传递给前台,然后前端在把这个sign当做参数,来发送请求.
    比如我打开一个订单详情页,后台传递过来sign值,这个sign值是根据当前订单号在后台经过一系列计算生成的.但如果我在打开这个详情页的url上,把订单号换成其他的号码,那么返回过来的不也是改过后的订单号所对应的sign值吗?我主要是迷惑,在 a.php?order=123&time=456&sign=abcdef 这个地址里,sign=abcdef 是如何获取的,后台传递给前台的话,如何防止别人伪造其他订单号而直接获取相对应的的sign值?忘说了,我用的是thinkPHP框架,第一次搞这个..有点搞不懂..