Eduardo Rabelo
Sep 1, 2018 · 3 min read

olá Felipe Alves Patricio, muito obrigado pela leitura e pela pergunta!

vou agrupar seu comentário em “perguntas semelhantes” e compartilhar a minha experiência:

> 1.Q:: Só fazia aplicações em PHP e nunca tinha tido esses problemas.

Mesmo com PHP, se você dividir seus recursos em domínios diferentes, você estará sujeito a CORS. Eu acredito/assumindo que nessas aplicações PHP você também renderizava sua aplicação. Você tem API e UI no mesmo domínio, por isso CORS não é um problema! A partir do momento que você coloca sua API em um domínio, api.produto.com.br e sua aplicação em outro, produto.com.br, suas requisições de recursos/assets (e.g. AJAX/FETCH/Font-Face/CSS/JS etc) estão sujeitas ao protocolo CORS.

> 2.Q:: Qual seria a melhor maneira de ... “evitar” o CORS?

Para “evitar” o CORS, você pode colocar tudo no mesmo domínio (como no item 1.A), servindo seu produto (SPA) a partir do “/” e API em “/api”. Existem diversas técnicas para isso, podenso usar seu framework back-end ou até mesmo Nginx/Apache/Infra para criar o roteamento.

> 3.Q: Qual seria a melhor maneira de trabalhar … CORS?

> 3.Q: Tentei varias coisas, hoje a API, está liberada. Mas qual a forma correta e segura?

> 3.Q: Só liberar na API, vai possibilitar acessos maliciosos?

> 3.Q: Como é utilizado normalmente em produção ?

Temos que levar em consideração que CORS é uma opção bem poderosa e, com grandes poderes temos grandes responsabilidades! Com isso, temos que ter atenção em dobro em um servidor/API com CORS.

Quem deve ter acesso a esses recursos? — Em 99.9% dos casos, é apenas UM domínio que precisa ter acesso aos recursos do seu api.produto.com.br, no nosso exemplo, seria produto.com.br. É importante permitir/listar APENAS os domínios que devem ter acesso a essa API e recursos como parte da sua configuração CORS

Posso usar "Access-Control-Allow-Origin":"*" em meus endpoints?APENAS se for conteúdo público, caso contrário, não, limite o acesso o máximo possível (lista de domínios, capturando IPs, etc)

Mas eu tenho GET, POST, PUT, DELETE, como identificar qual endpoint precisa ou não precisa?GET pode ser a única excessão aqui, pois esse tipo de requisição NÃO altera estados no servidor (sessão de usuário ou mudanças banco de dados) o restante, passe a régua da proteção. O seu bom senso que entra em ação aqui, podemos pensar da seguinte maneira: "TODOS os domínios (internet em geral) devem ter acesso para executar os recursos de resposta (CORS) dessa requisição GET?". 99.9% dos casos, é um não.

Liberando a API permite acesso malicioso? — Aqui é uma soma de fatores para se ter um acesso malicioso. Se você não estiver monitorando o acesso a sua API e ela estiver liberada, você está aumentando seu risco. Seu código back-end também deve estar tratando os parâmetros passado (escapando caracteres, validando inputs, etc), se não, também é outra facilidade que você coloca na mão de exploiters. Ninguém está 100% seguro online, mas nem por isso devemos facilitar, o peso é grande no ombro do desenvolvedor, se seus dados/empresa trabalham com dados sensíveis, invista tempo e dinheiro nessas validações de segurança.

Forma correta/utilizado em produção? — Tudo depende da aplicação, mas via de regra, sempre limite o acesso e monitore quem acessa sua API. Se você precisa liberar o acesso para terceiros, crie uma validação via tokens. Se apenas 3 domínios podem ter acesso a esses recursos, permita que APENAS esses 3 domínios possam ter acesso e ignore todo o resto. A partir do momento que você coloca algo no Heroku, AWS, DigitalOcean, o mundo inteiro tem acesso. E mesmo com aquela URL/IP maluco da AWS, você ficaria surpreso, ao monitorar sua API, a frequência que requisições da China/Russia/Pais que você nem conhece, aparecem nos seus logs.

Não sei qual linguagem você utiliza, mas abaixo listo 2 pacotes express que sempre estão em APIs públicas que trabalho:

A partir daí, você pode ter uma idéia do que procurar e como implementar para sua linguagem de servidor. Golang/Ruby tem ótimas soluções também!

Muitas vezes, identificar o IP que requisitou e limitar o acesso, já resolve bastante coisa.

TL;DR; — SEMPRE limite o acesso em CORS!

🤗👋

    Written by

    ☕🇳🇿 - https://eduardorabelo.me

    Welcome to a place where words matter. On Medium, smart voices and original ideas take center stage - with no ads in sight. Watch
    Follow all the topics you care about, and we’ll deliver the best stories for you to your homepage and inbox. Explore
    Get unlimited access to the best stories on Medium — and support writers while you’re at it. Just $5/month. Upgrade