Estamos trabalhando em um aplicativo Web, no qual (entre outros recursos) nossos usuários podem fazer upload de seus arquivos. No entanto, não podemos armazenar esses arquivos em nosso VPS porque o espaço de armazenamento é limitado, por isso decidimos seguir com o S3.
O principal problema é que devemos garantir que os usuários possam acessar apenas seus próprios dados. Portanto, mantemos a lista de arquivos em nosso banco de dados e a lista de usuários que têm acesso a eles. Nosso servidor pode facilmente decidir se um usuário tem ou não acesso a um arquivo. Mas como realmente servir os arquivos para os usuários?
Existem algumas possibilidades que eu já considerei, mas nenhuma delas parece ser a melhor.
1. Gerando (expirando) URLs assinados com PHP
Essa é uma abordagem muito simples, também é rápida, mas resulta em URLs muito muito feios e longos.
2. URLs ofuscados
Isto significa que podemos manter o público arquivos para leitura on S3, mas todos os arquivos são armazenados em difícil adivinhar pastas nomeadas como: 24fa0b8ef0ebb6e99c64be8092d3ede20000
. No entanto, talvez este não seja o caminho mais seguro a seguir. Mesmo que você nunca consiga adivinhar o nome de uma pasta, depois de conhecê-lo (porque você realmente tem acesso a ele), poderá compartilhar esse link com qualquer pessoa (com qualquer pessoa não autorizada).
3. Baixe os arquivos através do nosso servidor
Isso significa que os arquivos não são servidos diretamente pelo S3, mas primeiro nosso servidor os lê e os serve com segurança. Nós realmente não queremos isso :)
4. Verificando o referenciador
A solução de URLs ofuscadas pode ser aprimorada "certificando-se" de que a solicitação vem do nosso servidor (você pode configurar o S3 para verificar o referenciador). No entanto, essa seria uma solução muito confiável, porque nem todos os navegadores enviam os dados do referenciador e também podem ser falsificados.
Qual é uma boa maneira de veicular arquivos do Amazon S3 com segurança para diferentes clientes?