Como proteger os envios, se o usuário não estiver conectado?

70

Eu uso o wordpress para um site privado onde os usuários fazem upload de arquivos. Eu uso o "WordPress Privado" para impedir o acesso ao site se o usuário não estiver logado.

Eu gostaria de fazer o mesmo com os arquivos enviados na pasta de uploads.

Assim, se um usuário não estiver logado, não poderá acessar: enlace se eles tentarem acessar, mas não estiverem logados, eles devem ser redirecionados para a página de login, por exemplo.

Eu encontrei um plugin chamado arquivos privados, mas a última atualização foi em 2009 e parece não funcionar no meu wordpress.

Alguém conhece algum método? O método Hotlinking será suficiente para proteger isso?

Também encontrei este método:

# BEGIN WordPress
<IfModule mod_rewrite.c>
RewriteEngine On
RewriteBase /
RewriteCond %{REQUEST_URI} ^.*uploads/private/.*
RewriteCond %{HTTP_COOKIE} !^.*wordpress_logged_in.*$ [NC]
RewriteRule . /index.php [R,L]
RewriteRule ^index\.php$ - [L]
RewriteCond %{REQUEST_FILENAME} !-f
RewriteCond %{REQUEST_FILENAME} !-d
RewriteRule . /index.php [L]
</IfModule>
# END WordPress

Mas, então, qualquer usuário que replique o cookie pode transmitir isso corretamente? Atenciosamente

    
por chifliiiii 22.12.2011 / 17:46
fonte

3 respostas

78

Somente verificar se o cookie existe não é uma proteção muito rigorosa.

Para obter uma proteção mais strong, você pode passar ou "proxy" todas as solicitações para a pasta enviada (exemplo uploads no exemplo a seguir) por meio de um script php:

RewriteCond %{REQUEST_FILENAME} -s
RewriteRule ^wp-content/uploads/(.*)$ dl-file.php?file=$1 [QSA,L]

Todas as solicitações de upload de arquivos (que incluem imagens em postagens) vão para dl-file.php , que pode verificar se o usuário está logado ou não.

Se o usuário não estiver logado, o formulário de login do seu site será exibido. Após o login do usuário, ela será redirecionada de volta para o arquivo e poderá fazer o download agora.

Exemplar dl-file.php .

Algo semelhante pode ser encontrado em \wp-includes\ms-files.php em sua instalação do wordpress, mas esse é para multisite e sem a verificação de login e redirecionamentos.

Dependendo de quanto tráfego você tem, pode ser melhor integrá-lo ao seu servidor, por exemplo, X-Accel-Redirect ou X-Sendfile cabeçalhos.

    
por hakre 02.01.2012 / 22:50
fonte
14

Você também pode escrever um plug-in usando o init hook e o get-value $_GET[ 'file' ]; . Se o usuário tiver esse valor, salte em uma função para verificar os direitos de acesso nos arquivos: Por exemplo, com uma caixa de seleção em uma MetaBox.

add_action( 'init', 'fb_init' );
function fb_init() {
    // this in a function for init-hook
    if ( '' != $_GET[ 'file' ] ) {
        fb_get_file( $_GET[ 'file' ] );
    }
}

a função get_file ()

function fb_get_file( $file ) {

    $upload     = wp_upload_dir();
    $the_file   = $file; 
    $file       = $upload[ 'basedir' ] . '/' . $file;
    if ( !is_file( $file ) ) {
        status_header( 404 );
        die( '404 &#8212; File not found.' );
    }
    else {
        $image = get_posts( array( 'post_type' => 'attachment', 'meta_query' => array( array( 'key' => '_wp_attached_file', 'value' => $the_file ) ) ) );
        if ( 0 < count( $image ) && 0 < $image[0] -> post_parent ) { // attachment found and parent available
            if ( post_password_required( $image[0] -> post_parent ) ) { // password for the post is not available
                wp_die( get_the_password_form() );// show the password form 
            }
            $status = get_post_meta( $image[0] -> post_parent, '_inpsyde_protect_content', true );

            if ( 1 == $status &&  !is_user_logged_in() ) {
                wp_redirect( wp_login_url( $upload[ 'baseurl' ] . '/' . $the_file ) );
                die();
            }
        }
        else {
            // not a normal attachment check for thumbnail
            $filename   = pathinfo( $the_file );
            $images     = get_posts( array( 'post_type' => 'attachment', 'meta_query' => array( array( 'key' => '_wp_attachment_metadata', 'compare' => 'LIKE', 'value' => $filename[ 'filename' ] . '.' . $filename[ 'extension' ] ) ) ) );
            if ( 0 < count( $images ) ) {
                foreach ( $images as $SINGLEimage ) {
                    $meta = wp_get_attachment_metadata( $SINGLEimage -> ID );
                    if ( 0 < count( $meta[ 'sizes' ] ) ) {
                        $filepath   = pathinfo( $meta[ 'file' ] );
                        if ( $filepath[ 'dirname' ] == $filename[ 'dirname' ] ) {// current path of the thumbnail
                            foreach ( $meta[ 'sizes' ] as $SINGLEsize ) {
                                if ( $filename[ 'filename' ] . '.' . $filename[ 'extension' ] == $SINGLEsize[ 'file' ] ) {
                                    if ( post_password_required( $SINGLEimage -> post_parent ) ) { // password for the post is not available
                                        wp_die( get_the_password_form() );// show the password form 
                                    }
                                    die('dD');
                                    $status = get_post_meta( $SINGLEimage -> post_parent, '_inpsyde_protect_content', true );

                                    if ( 1 == $status &&  !is_user_logged_in() ) {
                                        wp_redirect( wp_login_url( $upload[ 'baseurl' ] . '/' . $the_file ) );
                                        die();
                                    }
                                }
                            }
                        }
                    }
                }
            }
        }
    }
    $mime       = wp_check_filetype( $file );

    if( false === $mime[ 'type' ] && function_exists( 'mime_content_type' ) )
        $mime[ 'type' ] = mime_content_type( $file );

    if( $mime[ 'type' ] )
        $mimetype = $mime[ 'type' ];
    else
        $mimetype = 'image/' . substr( $file, strrpos( $file, '.' ) + 1 );

    header( 'Content-type: ' . $mimetype ); // always send this
    if ( false === strpos( $_SERVER['SERVER_SOFTWARE'], 'Microsoft-IIS' ) )
        header( 'Content-Length: ' . filesize( $file ) );

    $last_modified = gmdate( 'D, d M Y H:i:s', filemtime( $file ) );
    $etag = '"' . md5( $last_modified ) . '"';
    header( "Last-Modified: $last_modified GMT" );
    header( 'ETag: ' . $etag );
    header( 'Expires: ' . gmdate( 'D, d M Y H:i:s', time() + 100000000 ) . ' GMT' );

    // Support for Conditional GET
    $client_etag = isset( $_SERVER['HTTP_IF_NONE_MATCH'] ) ? stripslashes( $_SERVER['HTTP_IF_NONE_MATCH'] ) : false;

    if( ! isset( $_SERVER['HTTP_IF_MODIFIED_SINCE'] ) )
        $_SERVER['HTTP_IF_MODIFIED_SINCE'] = false;

    $client_last_modified = trim( $_SERVER['HTTP_IF_MODIFIED_SINCE'] );
    // If string is empty, return 0. If not, attempt to parse into a timestamp
    $client_modified_timestamp = $client_last_modified ? strtotime( $client_last_modified ) : 0;

    // Make a timestamp for our most recent modification...
    $modified_timestamp = strtotime($last_modified);

    if ( ( $client_last_modified && $client_etag )
        ? ( ( $client_modified_timestamp >= $modified_timestamp) && ( $client_etag == $etag ) )
        : ( ( $client_modified_timestamp >= $modified_timestamp) || ( $client_etag == $etag ) )
        ) {
        status_header( 304 );
        exit;
    }

    // If we made it this far, just serve the file
    readfile( $file );
    die();
}

Você também pode adicionar um URL personalizado para arquivos por meio do gancho generate_rewrite_rules

add_filter( 'generate_rewrite_rules', 'fb_generate_rewrite_rules' );

function fb_generate_rewrite_rules( $wprewrite ) {
        $upload = wp_upload_dir();
        $path = str_replace( site_url( '/' ), '', $upload[ 'baseurl' ] );
        $wprewrite -> non_wp_rules = array( $path . '/(.*)' => 'index.php?file=$1' );
        return $wprewrite;
}
    
por bueltge 03.01.2012 / 11:20
fonte
1

Se você quiser uma abordagem baseada em plugins para resolver este problema, aqui está uma solução razoavelmente boa que eu encontrei (finalmente):

  1. Instale o plug-in 'Download Monitor', disponível em: enlace
  2. No WordPress Dashboard, vá para o novo item de menu 'Downloads' e adicione um novo 'Download', conforme descrito na documentação do plug-in site aqui: enlace . Anote o código de acesso 'Download' fornecido para você (por exemplo, salvar em Bloco de anotações). Observe que o arquivo é salvo em /wp-content/uploads/dlm_uploads/
  3. No metabox "Opções de download", especifique "Somente membros" (conforme documentado aqui enlace ) e clique em "Publicar".
  4. Na página que você deseja que os membros façam o download somente, adicione o código de acesso que você anotou na etapa 2 e "Publique / atualize" a página, conforme documentado aqui: enlace . Você pode alterar o modelo de link para download conforme descrito aqui enlace ou criar o seu próprio (por exemplo, para remover o Download 'contar')
  5. Navegue até a sua página, você deverá ver um link de download (mas que não revela o URL para o arquivo de download). Se você navegar para a mesma página em uma nova janela do navegador (ou na janela anônima), verá que o download não funciona mais.

Isso significa que qualquer pessoa não conectada não pode baixar o arquivo nem ver o URL real do arquivo. Se, no caso de alguém não autorizado descobrir o URL do arquivo, o plug-in também impedirá que os usuários naveguem para o URL do arquivo real, bloqueando o acesso à pasta /wp-content/uploads/dlm_uploads/ .

Bônus: se você está fazendo isso em um site onde você precisa que os usuários façam login como 'Membros' somente (mas não tenham permissões do WordPress como edição de página ou administração), instale o plug-in 'Members' enlace , crie uma nova função de usuário chamada 'Membro', e dê a ela a capacidade única de 'ler', crie um novo usuário no WordPress e certifique-se de dar-lhes um papel de 'Membro'.

Se você quiser proteger o conteúdo das páginas, o plug-in 'Members' fornece algumas opções ou há outros plug-ins disponíveis. Se você quiser criar um tema para a página de login para que os membros tenham uma aparência melhor do que o formulário de login padrão do WordPress, use algo como "Tema Meu Login": enlace

    
por Matty J 13.04.2017 / 11:09
fonte