Ir para conteúdo
Fórum Script Brasil
  • 0

Tem como proteger um diretório com o PHP


Matheus Matos

Pergunta

Gostaria de proteger um diretório no meu servidor remoto com um nome de usuário e uma senha, dentro desse diretório, terá subdiretorios e arquivos, gostaria que quando alguém fosse acessar algum arquivo que esteja dentro desse diretorio fossem bloqueados, tipo:

www.meusite.com.br/diretorioprotegido/subdiretorioprotegido/arquivoprotegido.html/

quando alguém tentasse acessar dessa maneira, gostaria que fosse solicitado login e senha.

sei que existem muitos sistemas para proteger esses arquivos, mas se eu colocar o código no próprio arquivo, e eu não queria assim, gostaria que protegesse o diretório, e se eu quiser proteger uma imagem? não tem como colocar o código na imagem né, por isso a necessidade de ser o diretório protegido.

espero ajuda! Vlw galera!

Editado por Matheus Matos
Link para o comentário
Compartilhar em outros sites

2 respostass a esta questão

Posts Recomendados

  • 0
Gostaria de proteger um diretório no meu servidor remoto com um nome de usuário e uma senha, dentro desse diretório, terá subdiretorios e arquivos, gostaria que quando alguém fosse acessar algum arquivo que esteja dentro desse diretorio fossem bloqueados, tipo:

www.meusite.com.br/diretorioprotegido/subdiretorioprotegido/arquivoprotegido.html/

quando alguém tentasse acessar dessa maneira, gostaria que fosse solicitado login e senha.

sei que existem muitos sistemas para proteger esses arquivos, mas se eu colocar o código no próprio arquivo, e eu não queria assim, gostaria que protegesse o diretório, e se eu quiser proteger uma imagem? não tem como colocar o código na imagem né, por isso a necessidade de ser o diretório protegido.

Bom amigão,

Você conseguirá fazer se seu projeto estiver em um servidor apache. Para isso você precisará criar um arquivo chamado .htaccess,

No seu .htaccess:

RewriteEngine on
RewriteBase /

RewriteRule ^(.*)$ index.php?querystring=$0 [QSA]
O código acima fará com que o apache pegue qualquer coisa depois da base e jogue na variável querystring. Feito isso é só usar a autenticação HTTP para fazer o resto, aqui vai um exemplo:
/**
 * Definindo locale e hora para Brasil
 */
setlocale( LC_ALL , 'pt_br' );
date_default_timezone_set( "America/Sao_Paulo" );

/**
 * Demonstração de sistema de autenticação HTTP utilizando PHP + Apache
 */
abstract class Main {
    /**
     * Mensagem que aparecerá quando não se identificar ou digitar um login e senha inválido
     */
    const ACESSO_NEGADO                = "Acesso negado";

    /**
     * Mensagem que aparecerá para solicitar o login e senha
     */
    const INDENTIFIQUE                = "Para acessar, identifique-se";

    /**
     * Mensagem para o erro HTTP 404
     */
    const ARQUIVO_NAO_ENCONTRADO    = "O arquivo solicitado não existe";

    /**
     * Mensagem que aparecerá se o usuário tentar recuperar um arquivo proibido: HTTP 403
     */
    const PROIBIDO                    = "Acesso negado ao arquivo solicitado";

    /**
     * Mensagem que aparecerá se o usuário tentar listar o conteúdo da pasta
     */
    const LISTAGEM_PROIBIDA            = "A listagem desse diretório é proibida";

    /**
     * O nome do usuário
     * @var string
     */
    static private $user;
    /**
     * A senha do usuário
     * @var string
     */
    static private $pswd;

    /**
     * Inicia a demonstração de autenticação via HTTP
     */
    static public function start(){
        /**
         * Verificamos se o usuário digitou seu login e senha, se não tiver digitado abrimos o diálogo
         * para que ele possa digitar
         */
        if ( !isset( $_SERVER[ "PHP_AUTH_USER" ] ) ){
            self::authentication();
        } else {
            /**
             * Recuperamos os dados digitados pelo usuário, se forem válidos então continuamos.
             */
            self::$user = $_SERVER[ "PHP_AUTH_USER" ];
            self::$pswd = $_SERVER[ "PHP_AUTH_PW" ];

            if ( self::validate() ){
                self::go();
            } else {
                /**
                 * Os dados são inválidos, solicitamos login e senha novamente
                 */
                self::authentication();
            }
        }
    }

    /**
     * Verificamos se o usuário está solicitando um arquivo ou uma pasta.
     * Se o arquivo que o usuário estiver solicitando existir então devolvemos o arquivo para o usuário.
     * Se o usuário estiver solicitando uma pasta, um erro HTTP 403 será retornado informando que a listagem de pastas é proibido
     */
    static private function go(){
        if ( isset( $_REQUEST[ "querystring" ] ) ){
            $file = $_REQUEST[ "querystring" ];

            if ( !empty( $file ) && !is_dir( $file ) ){
                if ( file_exists( $file ) ){
                    if ( !self::getFile( $file ) ){
                        header( "HTTP/1.0 403 Forbidden" );
                        printf( self::PROIBIDO );
                    }
                } else {
                    header( "HTTP/1.0 404 Not Found" );
                    printf( self::ARQUIVO_NAO_ENCONTRADO );
                }
            } else {
                header( "HTTP/1.0 403 Forbidden" );
                printf( self::LISTAGEM_PROIBIDA );
            }
        }
    }

    /**
     * Verifica se o arquivo solicitado pode ser recuperado, somente .jpg, .png e .gif são permitidos, para que outros
     * arquivos possam ser exibidos basta acrescentar um novo na lista
     *
     * @param string $file O arquivo que está sendo solicitado
     * @return boolean TRUE se o arquivo estiver na lista, FALSE se não.
     */
    static private function getFile( $file ){
        $ret    = false;
        $parts    = pathinfo( $file );

        switch ( $parts[ "extension" ] ){
            case "jpg":
            case "png":
            case "gif":
                $ret = true;

                header( "HTTP/1.0 200 OK" );
                header( sprintf( "Content-Type: image/%s" , $parts[ "extension" ] ) );
                header( sprintf( "Content-Length: %d" , filesize( $file ) ) );
                header( sprintf( "Date: %s" , gmstrftime( "%a, %d %b %Y %H:%M:%S %Z" , time() ) ) );
                header( sprintf( "Last-Modified: %s" , gmstrftime( "%a, %d %b %Y %H:%M:%S %Z" , filemtime( $file ) ) ) );
                readfile( $file );
                break;
        }

        return( $ret );
    }

    /**
     * Exibe o diálogo HTTP para autenticação
     */
    static private function authentication(){
        header( sprintf( 'WWW-Authenticate: Basic realm="%s"' , self::INDENTIFIQUE ) );
        self::unauthorized( self::ACESSO_NEGADO );
    }

    /**
     * Exibe o erro HTTP 401 para acesso negado
     */
    static private function unauthorized(){
        header( 'HTTP/1.0 401 Unauthorized' );
        printf( self::ACESSO_NEGADO );
    }

    /**
     * Valida os dados do usuário, aqui a validação pode ser de qualquer forma, inclusive recuperando os
     * dados em um banco de dados
     * @return boolean TRUE se os dados do usuário forem válidos
     */
    static private function validate(){
        $ret = false;

        if ( ( self::$user == "teste" ) && ( self::$pswd == "senha" ) ){
            $ret = true;
        }

        return( $ret );
    }
}

Main::start();

Coloque o código acima em um arquivo index.php na pasta que você quer proteger e na mesma pasta você coloca o .htaccess

[]'s

J. Neto

Editado por neto.joaobatista
Link para o comentário
Compartilhar em outros sites

  • 0
sei que existem muitos sistemas para proteger esses arquivos, mas se eu colocar o código no próprio arquivo, e eu não queria assim, gostaria que protegesse o diretório, e se eu quiser proteger uma imagem? não tem como colocar o código na imagem né, por isso a necessidade de ser o diretório protegido.

Dependendo da sua idéia, você pode proteger as pastas com senha, no caso se o seu servidor for apache, usaria o já citado .htaccess em conjunto com o .htpasswd, aqui você tem uma idéia de como funciona.

Link para o comentário
Compartilhar em outros sites

Participe da discussão

Você pode postar agora e se registrar depois. Se você já tem uma conta, acesse agora para postar com sua conta.

Visitante
Responder esta pergunta...

×   Você colou conteúdo com formatação.   Remover formatação

  Apenas 75 emoticons são permitidos.

×   Seu link foi incorporado automaticamente.   Exibir como um link em vez disso

×   Seu conteúdo anterior foi restaurado.   Limpar Editor

×   Você não pode colar imagens diretamente. Carregar ou inserir imagens do URL.



  • Estatísticas dos Fóruns

    • Tópicos
      152,1k
    • Posts
      651,8k
×
×
  • Criar Novo...