치아 오는 데이터 인터페이스의 보안에 대해 이야기

데이터 인터페이스 개선 코스

사업 이전에 필요로, 파충류의 작품의 일부 측면을 포함, 데이터 인터페이스의 틈새 제품 보안 문제의 일부를 발견, 인터페이스는 (아 어떤 안전 조치없이) 데이터의 어떤 부분을 수정도 호출 할 수 있습니다. '천국'을 사용하여야한다. 그래서 나는 포트 보안 기록의 배경에 대한 이해와 함께 작동합니다.

특히 현재 대부분의 프로젝트 전후 단부로부터 분리되어, 백엔드 인터페이스 보안 최우선이다. 결국, 데이터는 돈이다

토큰 검증

토큰 검증 나는이 프로젝트 방식 모바일 인터페이스의 시작 부분에서 수행하는 데 사용됩니다.

소위 토큰 검증은 사용자 ID와 암호가 작동 로그인 할 때, 서버는 로그인 토큰과 토큰 캐시 서버 (의 로그인 및 사용자 연결 후 클라이언트에 반환한다는 것입니다 Redis)와 그 설정된 시간 제한 (보통 삼십분 ), 고객 서비스 측면 다음에 모든 액세스 서버 측에 토큰 (Token) 필요, 배경은 확인하여 올바른 토큰, 토큰을 확인합니다

키 코드

//验证token
String token = request.getHeader("Token");
if(!jedisPoolService.exists(token)) 
  throw new TokenException("token is invalid");
复制代码

토큰 검증 + IP 불법적 인 접근

그러나 현재의 토큰 위에 만 존재 여부를 판단 할 수 있지만, 뭔가를하고있는 토큰이있는 경우, 당신은 제어 할 수 없습니다. (코드는 오랫동안이 인터페이스를 통해 호출)

따라서, 토큰 검증 함께 불법 IP와 판단에 근거 :

IP 블랙리스트 : 방문의 수는 우리가 문제를 정의보다 시간 (1 분)에 걸쳐 현재 IP 액세스가 해당 IP 접근 할 경우, 금지 및 현재 IP IP 액세스는 블랙리스트에 추가

경우 IP 액세스의 금지에,의 IP의 IP 블랙리스트에 있는지 여부를 확인하려면 인터페이스에 액세스하기 전에

키 코드

//判断ip
String ip = GlobalUtil.getIpAddr(request);  //获取当前IP

if(jedisPoolService.sismember(IP_BLOCK, ip)) {
    throw new NoParamException("黑名单禁止访问");
}

//判断当前ip是否超过访问次数
String key = IP_KEY.replace("{key}", ip);
int count = StringUtil.toInteger(jedisPoolService.get(key) != null ? jedisPoolService.get(key) : 0);
if(count > MAX_COUNT) {
    jedisPoolService.putSet(IP_BLOCK, ip);
    throw new NoParamException("超过访问次数");
}

jedisPoolService.incrAtTime(key, MAX_COUNT);
复制代码

토큰 + 타임 스탬프 + 서명 + IP 불법적 인 접근에 서명

타사 지불의 많은 노출 후에는 자신의 인터페이스 업그레이드 프로젝트를 시도 할 것이다

와 함께 타임 스탬프 토큰 검증의 기초에 서명 타임 스탬프를 서명합니다. 현재의 인터페이스에 액세스하는 잘못된 판정 : 규칙 타임 스탬프의 타임 스탬프와 현재 시간 (1 분, 예를 들어)이 소정 범위를 초과한다.

기호 서명 작업에 대한

  • 요청의 파라미터가 상승하는 ASCII 배치 소트
  • 정렬은 폼 KEY1에 접합 변수 (기호 매개 변수)를 수행 = VALUE1 및 키 2 = 값 2의
  • 접합의 문자열은 MD5 서명 서명 수득 수행 (전방 및 후방 단부 염의 적절한 규칙 일 수있다)

키 코드

//时间戳
Object o = objectMap.get("timestamp");
if(o == null)
  throw new NoParamException("参数timestamp为空");

Long timestamp = StringUtil.toLong(o);
if (LocalDateUtils.nowTime().getTime() - timestamp >= 1 * 60 * 1000)
  throw new NoParamException("timestamp已过期");

//sign
private String getSign2Map(Map<String, Object> map) {
  StringBuffer sb = new StringBuffer();
  ArrayList<String> list = new ArrayList<String>(map.keySet());
  Collections.sort(list);

  for (String key : list) {
      Object value = map.get(key);
      if (!key.equalsIgnoreCase("sign"))
          sb.append(key).append("=").append(map.get(key)).append("&");
  }
  sb.deleteCharAt(sb.length() - 1);
  return DigestUtil.getInstance().md5(sb.toString());
}
复制代码

큰 이동 토큰 + 타임 스탬프 + 기호 서명 + + HTTPS를 불법 IP 액세스

HTTPS : HTTP 기반의 프로토콜은 SSL을 통해 암호화 된 데이터를 제공하거나 TLS는 서로의 정체성과 데이터 무결성 보호를 확인

HTTPS를 약간 더 높은 비용, SSL 인증서, 더 강력한 인증서 수수료를 응용 프로그램을 구입해야합니다

무료 SSL 인증서 요청 여기를 클릭하십시오

큰 정도 위의 포트 보안을 보장하지만, 반드시 안전하지하는 (바보는 여전히 많은 사람들이 할). -_- ~~

통지

이론은 실제 전투와 동일하지 않은, 실제 개발은 개선이 필요한 것들의 많은 세부 사항은 여전히 ​​존재한다. 다음 섹션들은 상술 한 특정 방식으로 달성

추천

출처juejin.im/post/5d42a1b8e51d4561bf46201e