如果保证后端接口不会被随便调用?

正在开发一套WEB系统。这套系统挂接在某个APP里面。该APP暴露给我一个js接口用来让我获取登录APP用户的手机号。拿到用户手机号后我会请求自己的服务器接口来获取自己系统里面的该用户信息。
可是这样我发现我的接口无法验证传过来的手号是不是通过APP的js接口得到的。
这样无法验证我感觉很不安全,比如通过浏览器得到接口,然后随便写个手机号发送请求接口就能得到我系统里面的用户信息。

还有很多类似的情况,比如给接口传用户id或手机号来记录用户身份参加某个活动。按理说应该是用户本人进入活动页面点击了参加活动按钮才可以。但是也可能是别人随便一个手机号直接调用活动接口也能参加活动了。

想过用token方式来实现,研究了一下感觉token前提是得有用户登录的操作才可以。像我这个系统没有登录操作,因为登录操作已经在APP里面进行了,要求我这套系统不能再登录。那该如何才能保证安全呢?求各位的指点,在此提前感谢大家。

阅读 4.5k
6 个回答

我感觉是这样。APP暴露给我们一个js接口用来获取登录APP用户的手机号,APP不是我们负责的,所以其安全与否我们不需要关心,关心主要是也没有用。

如果APP接口只返回给我们手机号的话,其实是无法做不到百分百安全的,因为你无论怎么处理,加token也好,前端加密后端验证也罢。加token的过程与加密的过程等必然需要在前端进行,在前端进行就没有秘密可言。

所以我感觉我们只能是增加安全性,并没有办法彻底避免。

建议如下:

  1. 获取到用户手机号后,使用hash(手机号+签+时间戳)生成hash值,然后将手机号、hash值、时间戳一并传给后台,后台首先验证时间戳是否在合理的范围内(比如允许与服务器偏差60s),然后难hash值是否已经在60s使用过,最后在使用使用hash(手机号+签+时间戳)来验证接收的hash值是否合法。
  2. 在合法的情况下,为此手机号生成唯一的token,并在后台做好token与手机号的映射,然后把token返回给前端。
  3. 在以后的请求中,直接使用token来替待手机号,后台根据token来获取对应的手机号是哪个。

当然了,实际过程中可能还要更复杂一些,比如:设置token的有效期,在老token过期之前,前端发次老token来换取新token;在前端建立手机号与token的对应关系,所以发现手机号变了就重新请求一个新token等。

希望能够帮到你。

你可以试试让app端发出的接口里携带信息加密,然后后端解密出手机号

既然都说到了token 那为啥就一定是登陆携带的token?
自己去额外生成一个类似的标记不行?

我理解的是你的APP和你的web系统,要做同步登录的操作
两个系统之间的同步登录,传递的所有参数建议使用双方约定好的规则进行加密,
比如APP传递一个加密串给web系统,然后web系统再进行解密得到所有的参数,之后再进行用户校验

这样的好处是,只有APP方知道怎么加密你的参数,即使随便一个浏览器请求接口,WEB后台也无法校验成功,因为这个加密后的加密串是独属于APP的

得两边做对称加密,让app请求头带上加密签名,后端对签名进行有效性验证。

最简单的方式,你可以登陆的时候把token传给app,当进入web页面时,app通过js把token传给你,你就可以获得token了,但这种方式其实有很大的安全隐患,如果有人获得你的token,就能拿到用户信息了,如果你觉得这样不能接受,你还可以去了解一下签名机制,两个方式配合着用能阻挡很大一部分攻击

撰写回答
你尚未登录,登录后可以
  • 和开发者交流问题的细节
  • 关注并接收问题和回答的更新提醒
  • 参与内容的编辑和改进,让解决方法与时俱进
推荐问题