Como posso garantir as chamadas da API de descanso?

Estou a desenvolver a aplicação restful web que usa uma plataforma popular na infra-estrutura, digamos, rails, sinatra, flask, express.js). Idealmente, quero desenvolver o lado do cliente com firmeza.js. Como posso deixar apenas o meu cliente javascript interagir com essas chamadas da API? Eu não quero que essas chamadas API sejam públicas e sejam chamadas por {[[0]} ou simplesmente inserindo o link no navegador.

Author: knd, 2012-12-16

6 answers

Como primeiro princípio, se a sua API é consumida pelo seu cliente JS, você tem que assumir, que é público: um simples depurador JS coloca um atacante em uma posição, onde ele pode enviar um pedido de byte-por-byte idêntico a partir de uma ferramenta de sua escolha.

Dito isto, se eu ler a sua pergunta corretamente, isto não é, o que você quer evitar: o que você realmente não quer acontecer é, que a sua API é consumida (em uma base regular) sem que o seu cliente JS esteja envolvido. Aqui estão algumas ideias sobre como para se não executar, então pelo menos encorajar a utilização do seu cliente:

  • Tenho certeza, sua API tem algum tipo de campo de autenticação (por exemplo, Hash computado no cliente). Se não, dê uma olhada em esta pergunta assim . Certifique-se de que utiliza uma chave sal (ou mesmo API) que é dada ao seu cliente JS numa base de sessão (A.O.t. hardcoded). Desta forma, um consumidor não autorizado da sua API é forçado a trabalhar muito mais.

  • Ao carregar o cliente JS, lembre-se de alguns HTTP headers (agente de usuário vem à mente) e o endereço IP e pedir reautenticação se eles mudam, empregando listas negras para os suspeitos habituais. Isso força um atacante a fazer seu dever de casa mais completamente novamente.

  • No lado do servidor, lembre-se das últimas chamadas da API, e antes de permitir outra, verifique se a lógica de negócio permite a nova agora: isso nega a um atacante a capacidade de concentrar muitas de suas sessões em uma única sessão com o seu servidor: em combinação com as outras medidas, isso fará com que um abusador fácil detectável.

Posso não ter dito isso com a clareza necessária: considero impossível {[[10]} tornar completamente impossível para um abusador consumir o seu serviço, mas você pode torná-lo tão difícil, pode não valer a pena o incómodo.

 64
Author: Eugen Rieck, 2017-05-23 12:02:56

Você deve implementar algum tipo de Sistema de autenticação. Uma boa maneira de lidar com isso é definir algumas variáveis de cabeçalho esperadas. Por exemplo, você pode ter uma chamada auth/login API que retorna um token de sessão. As chamadas subsequentes para a sua API irão esperar que um token de sessão seja definido numa variável de cabeçalho HTTP com um nome específico como 'your-api-token'.

Em alternativa, muitos sistemas criam tokens de acesso ou chaves que são esperados (como youtube, facebook ou twitter) usando algum tipo de of api account system. Nesses casos, o seu cliente teria de guardar isto de alguma forma no cliente.

Então é apenas uma questão de adicionar um cheque para a sessão em sua estrutura de descanso e lançar uma exceção. Se possível, o código de Estado (para ser repousante) seria um erro 401.

 9
Author: gview, 2012-12-15 20:17:39
Há um padrão aberto agora chamado "símbolo da Web JSON",

Consulte https://jwt.io/ & https://en.wikipedia.org/wiki/JSON_Web_Token

JSON Web Token (JWT) é um padrão aberto baseado em JSON (RFC 7519) para criando fichas que afirmam algumas reivindicações. Por exemplo, um o servidor pode gerar um token que tenha a alegação "logado como administrador" e dá isso a um cliente. O cliente poderia então usar esse token para provar que estão registados como administrador. As fichas são assinadas pelo a chave do servidor, de modo que o servidor é capaz de verificar que o token é legitimo. Os tokens são projetados para serem compactos, URL-seguros e utilizáveis especialmente no contexto do navegador de internet single sign-on (SSO). JWT claims can ser normalmente utilizado para passar a identidade dos utilizadores autenticados entre um prestador de identidade e prestador de serviços, ou qualquer outro tipo de créditos conforme exigido pelos processos de Negócio.[1] [2] Os tokens também podem ser autenticado e codificar.[3][4]

 5
Author: bbozo, 2016-07-27 08:57:31
Desculpe-me @MarkAmery e Eugene, mas isso está errado.

A sua aplicação JS+html (cliente) em execução no navegador pode ser configurada para excluir As chamadas directas para a API não autorizadas como se segue:

  1. primeiro passo: configure a API para necessitar de autenticação. O cliente deve primeiro autenticar-se através do servidor (ou de outro servidor de segurança), por exemplo, pedindo ao utilizador humano que forneça a senha correcta.

Antes autenticação as chamadas para a API não são aceitos.

Durante a autenticação é devolvido um" token".

Após a autenticação só serão aceites as chamadas da API com a autenticação "token".

É claro que nesta fase apenas usuários autorizados que têm a senha podem acessar a API, embora se eles são programadores debugging o app, eles podem acessá-lo diretamente para fins de teste.

  1. segundo passo: Agora crie uma API de segurança extra, ou seja, ser chamado dentro de um curto prazo de tempo após o cliente JS+html app foi inicialmente solicitado do servidor. Este "callback" irá dizer ao servidor que o cliente foi baixado com sucesso. Restringir suas chamadas de API de descanso para funcionar apenas se o cliente foi solicitado recentemente e com sucesso.

Agora, a fim de usar a sua API, eles devem primeiro baixar o cliente e realmente executá-lo em um navegador. Só depois de receber com sucesso a chamada de volta, e, em seguida, a entrada do usuário dentro de um curto quadro de tempo, a API vai aceitar chamadas.

Por isso, não tem de se preocupar que possa ser um utilizador não autorizado sem credenciais. (O título da pergunta, "Como posso garantir as chamadas de API de descanso", e da maior parte do que você diz, Essa é a sua maior preocupação, e não a questão literal de como sua API é chamada, mas sim por quem, correto?)
 3
Author: pashute, 2018-07-24 04:33:20
  1. Defina uma VAR de sessão no servidor quando o cliente carregar pela primeira vez o seu index.html (ou backbone.js etc.)

  2. Verifica este var no servidor em todas as chamadas da API.

P. S. Esta não é uma solução de "segurança"!!! Isto é apenas para facilitar a carga em seu servidor para que as pessoas não abusem dele ou "hotlink" sua API de outros sites e aplicativos.
 0
Author: Alex, 2018-01-31 17:32:38
Eis o que eu faço:
  1. Proteger a API com um cabeçalho HTTP com chamadas como o X-APITOKEN:

  2. Usar as variáveis de sessão no PHP. Ter um sistema de login no lugar e salvar o token de usuário em variáveis de sessão.

  3. Ligue o código JS com Ajax para PHP e use a variável de sessão com curl para chamar a API. Dessa forma, se a variável sessão não estiver configurada, ela não vai chamar e o código PHP contém o Token de acesso à API.

 0
Author: Pavneet Singh, 2018-07-23 07:32:51