设计api的时候的安全策略

比如设计api的时候,存在2个合法的调用方,比如a和b;
api分为2类:部分api需要获取到调用方的身份信息(只是拿身份信息作为输入,比如插表或者查询条件),部分不需要
a调用全部api的时候,因为a是在某网站里面调用(ajax),所以登录了,能获取到身份信息。
b直接调用不需要用户信息的api(但是这些api也会被a调用)

问题。
如果我做个拦截器,拦截所有api请求(限制条件为,必须登录才能调用),那么对b是不合理的。因为b调用的api不需要身份信息
如果我不拦截请求,那么所有api对所有的人都是public的了,任何人都可以调用不需要身份信息的api,存在安全风险。

所以想问下如何处理?

看了下Jwt,好像不太适合应用场景

阅读 3.5k
4 个回答

你之所以出现这类的原因是因为你的接口没设计好

接口必须为单一职责,你的接口a也调用了接口b,明显就是接口逻辑不合理
a需要b的接口内容,那么正确的做法就是把a接口和b接口公共的逻辑抽象单独出来

代码演示:

<?php

class api

{

  public function a()
  {
   //需要登录 
   //获取公共部分逻辑
    $test = $this->_getTest();
  }
  
   public function b()
  {
   //不要需要登录 
   //获取公共部分逻辑
    $test = $this->_getTest();
    //todo
  }
  //公共部分逻辑业务单独拆开,权限分离  
  private function _getTest()
  {
   //公共逻辑,a和b都能调用,但是a是必须登录,b是无需登录
  }

}

我简单的给你说下思路,你所谓的拦截器应该是过滤器才是,我没写过Java,但是接口倒是写过一些,我给你说下简单的思路

过滤器(也许是你说的拦截器)

接口编写需要注意的大概步骤

  1. accessToken 判定(即使非登陆用户也可以通过特定接口授权一个动态的accessToken,看情况而定)
  2. 权限判定(可以包含路由选择,你对应的接口有相对应的权限需求,不是说统一暴力的根据是否登陆来拦截,而是根据该接口所需要的权限和访问者是否具备访问该接口的权限来做拦截判定)
  3. SQL 、XSS 之类的常规过滤拦截,特殊符号转换
  4. 参数化所有接受请求的参数
  5. 逻辑处理(如果有refer或者接口请求次序的支持需要,可以根据接口产生接口session)
  6. 数据相应与返回
  7. 标准化请求参数,数据返回类型
  8. 文档说明

以上只是编写一个接口的一个简单过程,可以根据自己的实际需求做完善和修改,因为不知道你实际的应用场景,为了安全性可能还需要做更多的安全校验

在B类调用AJAX的时候多传一个参数,然后你后台校验是否有登录或者这个参数。如果有登录或者这个参数就给它数据,如果不符合要求就不给它数据。这样?

新手上路,请多包涵

我觉得多加一个判断的变量就好了。
a调(参数,变量)
b调(参数,变量)
方法根据变量来确定是否要登陆。

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