Kullanıcı Giriş Yapmamışsa, Yüklemeler Nasıl Korunur?


79

WordPress'i kullanıcıların dosya yüklediği özel bir site için kullanıyorum. Kullanıcı oturum açmadıysa siteye erişimi engellemek için "Özel WordPress" kullanıyorum.

Aynı şeyi uploads klasörüne yüklenen dosyalara da yapmak istiyorum.

Bir kullanıcı giriş yapmadıysa, erişemeyecekler: https://xxxxxxx.com/wp-content/uploads/2011/12/xxxxxxx.pdf Eğer erişmeye çalışırlarsa, fakat giriş yapmazlarsa örneğin giriş sayfasına yönlendirileceksiniz.

Özel dosyalar adında bir eklenti buldum ama son güncelleme tarihi 2009 yılında yapıldı ve benim wordpress'im üzerinde çalışmıyor gibi görünüyor.

Herhangi bir yöntem bilen var mı? Hotlinking yöntemi bunu korumak için yeterli olacak mı?

Ayrıca bu yöntemi buldum:

# 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

Fakat çerezi kopyalayan herhangi bir kullanıcı bu hakkı geçebilir mi? Saygılarımızla


1
Site kökünün dışındaki gibi farklı bir yükleme dizini kullanamamanızın bir nedeni var mı?
onetrickpony

Gerçekten değil ama zaten bu dizindeki
yazılara

Yanıtlar:


86

Yalnızca tanımlama bilgisinin var olup olmadığını kontrol etmek sıkı bir korumadan ibaret değildir.

Daha güçlü bir koruma elde etmek için, tüm istekleri yüklenen klasöre ( uploadsaşağıdaki örnekte gösterilen örnek) bir php betiği aracılığıyla iletebilir veya "proxy" edebilirsiniz :

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

Yüklenen dosyalara yapılan tüm istekler (postalardaki görüntüleri içeren) dl-file.php, kullanıcının oturum açıp açmadığını doğrulayabilir.

Kullanıcı giriş yapmamışsa, sitelere giriş formunuz gösterilecektir. Kullanıcı giriş yaptıktan sonra, dosyaya tekrar yönlendirilecek ve şimdi indirebilecektir.

Örnek teşkildl-file.php .

\wp-includes\ms-files.phpWordpress kurulumunuzda benzer bir şey bulunabilir , ancak bu çok kullanıcılı ve giriş kontrolü olmayanlar için de geçerlidir.

Ne kadar trafik bağlı olarak, daha iyi sunucu, örneğin bu entegre etmek akıllıca olabilir X-Accel-Redirectveya X-Sendfilebaşlıklarını.


1
Dosyaları wp-content / uploads / secure gibi bir alt dizinde saklamak istersem dl-file.php dosyasını nasıl ayarlarım?

Bu gerçekten güvenli bir çözümdür. Web’de bulabileceğiniz herhangi bir şey var; örneğin yönlendirici başlığını kontrol etmek, çerezleri kontrol etmek, dizin listelerine izin vermemek, yarım bir ölçüdür, çünkü HTTP istek başlıklarını kolayca dolaşabilirsiniz.
Luke

Çocuklar ... bu benim için mükemmel bir çözüm gibi görünüyordu .... sorun şu ki, yükleme klasöründen bazı PDF'lere erişmek için Mozilla'dan PDFJS kullanıyorum ve PDFJS sadece ilgilendiği sayfaları almak için kısmi içerik başlıkları kullanıyor. .bu yüzden bu çözüm benim için bir sorun değil. baska öneri??
Otto Nascarella

@OttoNascarella: PHP'den kısmi içerik istekleri bugünden itibaren çözüldü, bu bu wordpress sorusundan bağımsız. Etki, soru zaten oldukça eski: Dosyayı göndermek için PHP kullanırken yeniden başlatılabilir indirmeler?
hakre

@hakre Web sitesinin ön sayfasında kullanılan görsellerden bazıları ve siteyi ziyaret eden kullanıcılar hakkında ne düşünüyorsunuz? Giriş yapmazsam bana 404 hatası veriyor.
Dhaval Panchal

14

initKanca ve get-value kullanarak bir eklenti de yazabilirsiniz $_GET[ 'file' ];. Kullanıcı bu değere sahipse, dosyalara erişim haklarını kontrol etmek için bir fonksiyona atlayın: Örneğin, bir Meta Kutusunda bir onay kutusuyla.

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

get_file () işlevi

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();
}

Kanca üzerinden dosyalar için özel bir URL de ekleyebilirsiniz. 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;
}

Bu yanımda işe yaramadı kimse nedenini biliyor mu? Ben tam olarak kopyalarım.
Ryan S

Koruma sadece pdf çalışıyor. gibi çalışmayan diğer dosya uzantısı: doc, docx, jpg ve etc ...
Patel

1

Bu sorunu çözmek için eklenti temelli bir yaklaşım istiyorsanız, işte (nihayet) bulduğum oldukça iyi bir çözüm:

  1. 'Download Monitor' eklentisini şu adreste bulabilirsiniz:
    https://wordpress.org/plugins/download-monitor/
  2. WordPress Panosunda, yeni 'İndirilenler' menü öğesine gidin ve buradaki eklenti dokümantasyon web sitesinde açıklandığı şekilde yeni bir 'İndirme' ekleyin: https://www.download-monitor.com/kb/adding-downloads/ . Size verilen 'İndirme' kısa kodunu not edin (örn. Not Defteri'ne kaydedin). Dosyanın kaydedildiğini unutmayın./wp-content/uploads/dlm_uploads/
  3. 'İndirme seçenekleri' meta kutusunda, 'Yalnızca Üyeler'i belirtin (burada belirtildiği gibi https://www.download-monitor.com/kb/download-options/ ) ve' Yayınla'yı tıklayın.
  4. Sadece Üyelerin indirilmesini istediğiniz sayfada, # 2 adımında not aldığınız kısa kodu ve bu belgede belirtildiği gibi sayfayı 'Yayınla / Güncelle' seçeneğini ekleyin: https://www.download-monitor.com / kb / shortcode-indir / . İndirme bağlantı şablonunu burada açıklandığı şekilde değiştirebilirsiniz, https://www.download-monitor.com/kb/content-templates/ veya kendi grubunuzu oluşturabilirsiniz (örneğin, 'sayma sayısını' kaldırmak için).
  5. Sayfanıza göz atın, bir indirme bağlantısı görmelisiniz (ancak indirme dosyasının URL’sini göstermez). Aynı sayfaya yeni bir tarayıcı penceresinde (veya Gizli pencerede) göz atarsanız, indirme işleminin artık çalışmadığını bulmalısınız.

Bu, oturum açmamış hiç kimsenin dosyayı indiremeyeceği veya dosyanın gerçek URL'sini göremeyeceği anlamına gelir. Birinin yetkisiz olması durumunda dosyanın URL'sini bulması durumunda, eklenti, kullanıcıların /wp-content/uploads/dlm_uploads/klasöre erişimi engelleyerek gerçek dosya URL'sine göz atmasını da durdurur .

Bonus: Kullanıcıları yalnızca 'Üyeler' olarak giriş yapabilmeniz (ancak sayfa düzenleme veya Yönetici olarak WordPress izinlerine sahip olmamanız gereken) bir site için yapıyorsanız, 'Üyeler' eklentisini yükleyin https: // wordpress .org / plugins / members / , 'Member' adlı yeni bir kullanıcı rolü oluşturun ve ona 'okuma' özelliğini verin, WordPress'te yeni bir Kullanıcı oluşturun ve onlara 'Üye' rolü verdiğinizden emin olun.

Sayfaların içeriğini korumak istiyorsanız, 'Üyeler' eklentisi bazı seçenekler sunar veya başka eklentiler de vardır. Üyelerin giriş sayfasını WordPress varsayılan giriş formundan daha iyi görünmesini istiyorsanız, 'Girişim Tema' gibi bir şey kullanın: https://wordpress.org/plugins/theme-my-login/


Yukarıda anlattığım süreç de burada açıklanmıştır, ancak görebildiğiniz gibi sadece PDF'lere özgü olması gerekmiyor
Matty J
Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.