यदि उपयोगकर्ता लॉग इन नहीं है, तो अपलोड को कैसे सुरक्षित रखें?


79

मैं एक निजी साइट के लिए वर्डप्रेस का उपयोग करता हूं जहां उपयोगकर्ता फाइलें अपलोड करते हैं। यदि उपयोगकर्ता लॉग इन नहीं है तो मैं साइट पर पहुंच को रोकने के लिए "प्राइवेट वर्डप्रेस" का उपयोग करता हूं।

मैं अपलोड फ़ोल्डर में अपलोड की गई फ़ाइलों के समान करना चाहूंगा।

इसलिए यदि कोई उपयोगकर्ता जो इसमें लॉग इन नहीं करता है, तो वे एक्सेस नहीं कर पाएंगे: https://xxxxxxx.com/wp-content/uploads/2011/12/xxxxxxx.pdf यदि वे एक्सेस करने का प्रयास करते हैं, लेकिन वे लॉग नहीं हैं, तो उन्हें करना चाहिए उदाहरण के लिए लॉगिन पृष्ठ पर पुनर्निर्देशित किया जाए।

मुझे एक फाइल्स मिलीं, जिसे प्राइवेट फाइल्स कहा जाता है, लेकिन आखिरी बार अपडेट 2009 में हुई थी और यह मेरे वर्डप्रेस पर काम नहीं करती है।

किसी को कोई विधि पता है? इसकी सुरक्षा के लिए हॉटलिंकिंग विधि पर्याप्त होगी?

मुझे भी यह विधि मिली:

# 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

लेकिन फिर कुकी को दोहराने वाला कोई भी उपयोगकर्ता इस अधिकार को पारित कर सकता है? सादर


1
किसी भी कारण से आप एक अलग अपलोड निर्देशिका का उपयोग नहीं कर सकते हैं, जैसे कि साइट रूट के बाहर एक?
onetrickpony

नहीं वास्तव में, लेकिन मैं पहले से ही उस निर्देशिका में पदों से जुड़ी फाइलों के टन है, अगर मैं एक उचित समाधान पा सकते हैं चारों ओर घूमने में मन नहीं है
chifliiiii

जवाबों:


86

केवल जाँच अगर कुकी मौजूद है, तो एक सख्त सुरक्षा नहीं है।

एक मजबूत सुरक्षा प्राप्त करने के लिए, आप अपलोड किए गए फ़ोल्डर ( uploadsनिम्नलिखित उदाहरण में अनुकरणीय ) के सभी अनुरोधों को php स्क्रिप्ट के माध्यम से पारित या "प्रॉक्सी" कर सकते हैं :

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

अपलोड की गई फ़ाइलों के सभी अनुरोध (जिसमें पोस्ट में छवियां शामिल हैं) dl-file.phpजो तब जाकर सत्यापित करेंगे कि उपयोगकर्ता लॉग इन है या नहीं।

यदि उपयोगकर्ता लॉग इन नहीं है, तो आपकी साइटें लॉगिन-फॉर्म दिखाई देंगी। उपयोगकर्ता द्वारा लॉग इन करने के बाद, वह फ़ाइल पर वापस निर्देशित हो जाएगी और अब इसे डाउनलोड कर सकती है।

अनुकरणीयdl-file.php

\wp-includes\ms-files.phpआपके वर्डप्रेस इंस्टॉलेशन में कुछ समान पाया जा सकता है , लेकिन यह एक मल्टीसाइट और w / o के लिए लॉगिन चेक और रीडायरेक्ट है।

आपके पास कितना ट्रैफ़िक है, इसके आधार पर, अपने सर्वर, जैसे X-Accel-Redirectया X-Sendfileहेडर के साथ इसे बेहतर तरीके से एकीकृत करना बुद्धिमानी हो सकता है ।


1
आप dl-file.php को कैसे समायोजित कर सकते हैं अगर मैं फ़ाइलों को wp-content / uploads / safe जैसे उपनिर्देशिका में संग्रहीत करना चाहता हूँ?

यह वास्तव में एकमात्र सुरक्षित समाधान है। वेब पर आप कुछ भी पा सकते हैं, जैसे कि रेफर हेडर चेक करना, कुकीज चेक करना, डायरेक्टरी लिस्टिंग को डिसलाइक करना, यह एक आधा उपाय है क्योंकि आप HTTP रिक्वेस्ट हेडर को आसानी से इधर-उधर कर सकते हैं।
ल्यूक

दोस्तों .. यह मेरे लिए सही समाधान की तरह लग रहा था .... समस्या यह है, मैं अपलोड फ़ोल्डर से कुछ पीडीएफ का उपयोग करने के लिए मोज़िला से पीडीएफजेएस का उपयोग कर रहा हूं, और पीडीएफजेएस केवल उन पृष्ठों को प्राप्त करने के लिए आंशिक-सामग्री हेडर का उपयोग करता है जो इसमें रुचि रखते हैं .. .तो यह समाधान मेरे लिए कोई नहीं है। कोई सुझाव??
ओटो नास्करेला

@OttoNascarella: PHP के लिए आंशिक सामग्री अनुरोधों को आज के रूप में हल किया गया है, यह इस वर्डप्रेस प्रश्न के लिए स्वतंत्र है। वास्तव में, यह प्रश्न पहले से ही पुराना है: फ़ाइल भेजने के लिए PHP का उपयोग करते समय फिर से शुरू करने योग्य डाउनलोड?
हकरे

@ खाक वेबसाइट के फ्रंट पेज पर इस्तेमाल की गई कुछ इमेज और किसी भी यूजर की साइट पर आने के बारे में क्या कहना है? अगर मैं लॉगिन नहीं हूं तो यह मुझे 404 त्रुटि देता है।
धवल पांचाल

14

आप initहुक और गेट-वैल्यू का उपयोग करके एक प्लगइन भी लिख सकते हैं $_GET[ 'file' ];। यदि उपयोगकर्ता के पास यह मान है, तो फ़ाइलों पर पहुंच के अधिकारों की जांच करने के लिए फ़ंक्शन में कूदें: उदाहरण के लिए मेटा बॉक्स में चेकबॉक्स के साथ।

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

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

आप हुक के माध्यम से फ़ाइलों के लिए एक कस्टम URL भी जोड़ सकते हैं 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;
}

यह मेरी तरफ से काम नहीं किया किसी को पता नहीं क्यों? मैं बिल्कुल कॉपी करता हूं।
रयान एस

संरक्षण केवल पीडीएफ। अन्य फ़ाइल एक्सटेंशन जैसे काम नहीं कर रहे हैं: डॉक्टर, डॉक्टर, jpg और आदि ...
पटेल

1

यदि आप इस समस्या को हल करने के लिए एक प्लगइन-आधारित दृष्टिकोण चाहते हैं, तो यहां एक उचित अच्छा समाधान है जो मेरे पास है (अंत में) मिला:

  1. प्लगइन डाउनलोड करें 'मॉनिटर' पर स्थापित करें: https://wordpress.org/plugins/download-monitor/ पर उपलब्ध
  2. वर्डप्रेस डैशबोर्ड में, नए 'डाउनलोड' मेनू आइटम पर जाएं और एक नया 'डाउनलोड' जोड़ें, जैसा कि यहां प्लगइन प्रलेखन वेबसाइट पर वर्णित है: https://www.download-monitor.com/kb/adding-downloads/ । आपके लिए प्रदान किए गए 'डाउनलोड' शोर्ट पर ध्यान दें (उदाहरण के लिए नोटपैड में सेव करें)। ध्यान दें कि फ़ाइल में सहेजा गया है/wp-content/uploads/dlm_uploads/
  3. 'डाउनलोड विकल्प' मेटाबॉक्स में, 'केवल सदस्यों को निर्दिष्ट करें' (जैसा कि यहां दस्तावेज दिया गया है https://www.download-monitor.com/kb/download-options/ ), और 'प्रकाशित करें' पर क्लिक करें।
  4. जिस पृष्ठ पर आप चाहते हैं कि सदस्य केवल डाउनलोड करने के लिए दिखाई दें, आपने जो चरण # 2 में नोट किया है, उस शोर्ट में जोड़ें और पृष्ठ को 'प्रकाशित / अपडेट' करें, जैसा कि यहाँ दर्ज़ है: https://www.download-monitor.com / केबी / शोर्ट-डाउनलोड / । आप डाउनलोड लिंक टेम्पलेट को यहाँ वर्णित https://www.download-monitor.com/kb/content-templates/ के रूप में बदल सकते हैं , या अपना खुद का बना सकते हैं (उदाहरण के लिए, डाउनलोड 'गिनती' को हटाने के लिए)
  5. अपने पृष्ठ पर ब्राउज़ करें, आपको एक डाउनलोड लिंक देखना चाहिए (लेकिन जो डाउनलोड फ़ाइल के लिए URL प्रकट नहीं करता है)। यदि आप एक नई ब्राउज़र विंडो (या गुप्त विंडो) में उसी पृष्ठ पर ब्राउज़ करते हैं, तो आपको यह पता लगाना चाहिए कि डाउनलोड अब काम नहीं करता है।

इसका अर्थ है कि कोई भी व्यक्ति जो लॉग इन नहीं करता है, वह फ़ाइल को डाउनलोड नहीं कर सकता है या फ़ाइल का वास्तविक URL नहीं देख सकता है। यदि इस घटना में कि कोई व्यक्ति अनाधिकृत रूप से फाइल को URL से बाहर निकालता है, तो प्लगइन भी /wp-content/uploads/dlm_uploads/फ़ोल्डर में पहुंच को रोककर उपयोगकर्ताओं को वास्तविक फ़ाइल URL पर ब्राउज़ करना बंद कर देता है ।

बोनस: यदि आप ऐसा किसी साइट के लिए कर रहे हैं, जहाँ आपको उपयोगकर्ताओं को केवल 'सदस्य' के रूप में लॉगिन करने में सक्षम होना चाहिए (लेकिन पृष्ठ संपादन या व्यवस्थापक की तरह कोई वर्डप्रेस अनुमति नहीं है), 'सदस्य' प्लगइन को स्थापित करें https: // wordpress .org / plugins / members / , 'सदस्य' नामक एक नई उपयोगकर्ता भूमिका बनाते हैं, और इसे 'रीड' की एकल क्षमता देते हैं, वर्डप्रेस में एक नया उपयोगकर्ता बनाते हैं, और उन्हें 'सदस्य' की भूमिका देना सुनिश्चित करते हैं।

यदि आप पृष्ठों की सामग्री की रक्षा करना चाहते हैं, तो 'सदस्य' प्लगइन कुछ विकल्प प्रदान करता है, या वहाँ अन्य प्लगइन्स हैं। यदि आप WordPress डिफ़ॉल्ट लॉगिन फ़ॉर्म से बेहतर देखने के लिए सदस्यों के लिए लॉगिन पृष्ठ को थीम बनाना चाहते हैं, तो 'थीम माई लॉगइन': https://wordpress.org/plugins/theme-my-login/ जैसी किसी चीज़ का उपयोग करें


मैंने ऊपर जो प्रक्रिया बताई है वह भी यहाँ बताई गई है, हालाँकि जैसा कि आप देख सकते हैं कि यह केवल PDF के लिए विशिष्ट नहीं है: thedigitalcrowd.com/website-development/wordpress/…
Matty J
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.