Pergunta

Estou usando um plano de hospedagem da Web do GoDaddy em uma plataforma Windows. Essa não foi a minha escolha - tem a ver com uma parte diferente do site real usando asp.net (também não minha escolha).

Eu tenho um banco de dados SQL com várias entradas com algumas informações não sensíveis ao cliente. A chave primária é um número inteiro de autoin -sucrent, e eu tenho uma série de arquivos PDF que correspondem a cada um desses números inteiros (por exemplo, 555.pdf, 7891.pdf, etc).

Meu objetivo é restringir o acesso direto a esses arquivos, quero que os usuários tenham que passar por um processo de pesquisa e login (PHP) primeiro. Originalmente, planejava colocar os arquivos acima da pasta public_html, mas o Godaddy se recusa a me dar acesso root sem um servidor dedicado (US $ 20 por mês deles).

A próxima coisa que olhei foi htaccess. Eu ia restringir o acesso aos arquivos apenas a scripts PHP, permitindo apenas o acesso ao endereço IP do servidor (ou localhost/127.0.0.1). Infelizmente, isso não funciona porque a Godaddy não executa o Apache em seus servidores Windows.

Eu poderia colocar os arquivos em blobs no banco de dados, mas isso fica muito confuso quando preciso trabalhar com eles rapidamente (além de ter tido alguns problemas com essa abordagem).

Alguma sugestão para restringir o acesso aos arquivos apenas a um script php (readfile ())?

Foi útil?

Solução

Como você não pode colocar os arquivos em nenhum lugar, exceto no seu diretório public_html, você terá que optar pelo método "Segurança por obscuridade" temida/odiada

  1. Crie um subdiretório nomeado aleatoriamente para armazenar os arquivos em: public_html/randomarbage

  2. Verifique se o diretório não é navegável. Desative a navegação do diretório (se puder) e coloque um documento padrão (index.html?)

  3. Não armazene seus arquivos com nomes adivinhados. Em vez de armazená -los com o ID do banco de dados, armazene -os com um nome de Salted+Hashed: $crypted_filename = sha1($real_filename . 'some hard-to-guess salt text'); (Claro, torne isso mais complexo, se necessário). Armazene o nome do arquivo original em seu banco de dados. Então você acaba com algo como:

    public_html/RANDOMGARBAGE/5bf1fd927dfb8679496a2e6cf00cbe50c1c87145 public_html/RANDOMGARBAGE/7ec1f0eb9119d48eb6a3176ca47380c6496304c8

  4. Sirva os arquivos por meio de um script PHP - nunca vincule -se ao nome do arquivo hashed diretamente

    Download

que então faz:

<?php

    $fileID = (int)$_GET['fileID'];

    $crypted_file = sha1($fileID . 'some hard-to-guess salt text');

    $full_path = 'public_html/RANDOMGARBAGE/' . $crypted_file;
    if (is_readable($full_path)) {
         if(user_is_allowed_to_see_this_file()) {
             /// send file to user with readfile()
             header("Content-disposition: attachment; filename=$ORIGINAL_FILENAME");
             readfile($full_path);
         } else {
             die("Permission denied");
         }
    } else {
        /// handle problems here
        die("Uh-oh. Can't find/read file");
    }

Dessa forma, o usuário nunca verá qual é o seu nome de arquivo "s00per seekrit" ...php?fileID=37 e iniciar um download de secret file.pdf

Além disso, você pode ocasionalmente renomear o subdiretório especial para outra coisa regularmente, além de alterar o texto do sal (o que exige que você atualize todos os nomes de arquivos com hash com os novos valores SHA1).

Outras dicas

Você pode simplesmente escondê -los. É a segurança de segurança, mas parece a sua melhor opção se você não puder mantê-los fora da raiz da web ou encontrar uma maneira de dizer ao servidor para não servir diretamente.

Então coloque-os em algum diretório de nome aleatoriamente:

asd8b8asd8327bh/123.pdf
asd8b8asd8327bh/124.pdf
asd8b8asd8327bh/125.pdf
...

Em seguida, escreva um pequeno script PHP que enviará cabeçalhos apropriados e passe o conteúdo do arquivo.

por exemplo:

<?PHP
//pdf.php
$id = $_GET['id'];

//make sure nobody is doing anything sneaky. is_numeric() might do the trick if the IDs are always integers.
if (!some_validation_passes($id)){
  die();
}
<?php

header('Content-type: application/pdf');
header('Content-Disposition: attachment; filename="'.$id.'.pdf"');
readfile('asd8b8asd8327bh'.$id.'pdf');

Agora, o exposto acima não é realmente melhor do que apenas servir os arquivos diretamente (ainda), pois as pessoas ainda podem incrementar o parâmetro ID na sequência de consultas.

Mas você deve ser capaz de descobrir como lidar com a autorização com bastante facilidade.

Como o PHP usa as permissões do usuário do servidor da web, não há como restringir o acesso aos arquivos sem:

  • Colocando -os fora do docroot
  • Alterando a configuração do servidor da web para não permitir acesso a esses arquivos
  • Alterando o arquivo para que seja interpretado pelo servidor da web, ocultando seu conteúdo

Colocá -los em um banco de dados conta como fora do docroot. Para a terceira opção, você pode fazer os arquivos PDFs PHP, mas honestamente, isso seria bastante complicado.

Eu recomendo que você entre em contato com o GoDaddy e veja se eles têm alguma maneira de configurar permissões de arquivo por diretório.

Torne a Web de pasta inacessível via chmod. O PHP ainda poderá incluir/exigir o que estiver no servidor, mas os usuários não poderão navegar para os arquivos de sempre.

Exemplo: isso está definido como 770, ou seja, o usuário e o grupo podem ler/gravar/executar, outros não podem fazer nada.

Licenciado em: CC-BY-SA com atribuição
Não afiliado a StackOverflow
scroll top