किसी विशिष्ट उपयोगकर्ता के लिए अनुलग्नक डाउनलोड को कैसे प्रतिबंधित करें?


12

मेरे पास एक बहुत विशिष्ट उपयोग का मामला है जहां एक वकील और उसके प्रत्येक ग्राहक के लिए बनाई गई साइट wp-admin आदि तक पहुंचने की क्षमता के बिना अपने स्वयं के 'विशिष्ट पृष्ठ / पोर्टल' (कस्टम पोस्ट प्रकार) पर लॉगिन कर सकती है (मैंने सभी को बनाया है) सामने के छोर पर लॉगिन / रजिस्टर / प्रोफाइल-संपादन पृष्ठ)। इस पृष्ठ / पोर्टल में वकील ग्राहक को डाउनलोड करने के लिए संदेश और फाइलें छोड़ देगा , अब सैद्धांतिक रूप से, एक ग्राहक अनुमान लगा सकता है (या यदि किसी अन्य ग्राहक की फाइलों का ज्ञान है) अन्य फ़ाइल नाम और डाउनलोड तो इस प्रकार गोपनीयता / सुरक्षा के साथ एक मुद्दा बना रहा है / गोपनीय सामग्री आदि।

मैं एक समाधान के लिए विचारों / अवधारणाओं की तलाश कर रहा हूं, मेरा शुरुआती विचार कुछ डाउनलोड करने के लिए डाउनलोड लिंक बिंदु था। अनुलग्नक आईडी, उपयोगकर्ता आईडी, पेज / पोर्टल आईडी और नॉन को भेजने और दूसरे छोर पर प्रसंस्करण पर। ।

तुम क्या सोचते हो? क्या मैं सही रास्ते पर हूँ या यह दृष्टिकोण त्रुटिपूर्ण है?

धन्यवाद!


क्या आपने इसके लिए कोई हल ढूंढा है?
ब्रासोफिलो

@brasofilo, नहीं ..
अमित

जवाबों:


6

क्या होने की जरूरत है कि आपको वर्डप्रेस के माध्यम से इच्छित फ़ाइल प्रकारों के लिए प्रॉक्सी डाउनलोड करने की आवश्यकता है। मान लेते हैं कि आप ".doc" फ़ाइलों तक पहुँच को प्रतिबंधित करने जा रहे हैं।

1. एक क्वेरी चर को परिभाषित करें जो अनुरोधित फ़ाइल को इंगित करता है

function add_get_file_query_var( $vars ) {
    $vars[] = 'get_file';
    return $vars;
}
add_filter( 'query_vars', 'add_get_file_query_var' );

2. अद्यतन। वर्डप्रेस को प्रतिबंधित फ़ाइलों के लिए अग्रेषित अनुरोधों के लिए

यह उन फ़ाइलों के अनुरोधों को कैप्चर करेगा जिन्हें आप प्रतिबंधित करना चाहते हैं और ऊपर दिए गए कस्टम क्वेरी चर का उपयोग करके उन्हें वर्डप्रेस पर वापस भेज सकते हैं। RewriteCondलाइनों से पहले निम्नलिखित नियम डालें ।

RewriteRule ^wp-content/uploads/(.*\.docx)$ /index.php?get_file=$1

3. कस्टम क्वेरी चर में अनुरोधित फ़ाइल नाम पर कब्जा; और फ़ाइल तक पहुँच सत्यापित करें:

function intercept_file_request( $wp ) {
    if( !isset( $wp->query_vars['get_file'] ) )
        return;

    global $wpdb, $current_user;

    // Find attachment entry for this file in the database:
    $query = $wpdb->prepare("SELECT ID FROM {$wpdb->posts} WHERE guid='%s'", $_SERVER['REQUEST_URI'] );
    $attachment_id = $wpdb->get_var( $query );

    // No attachment found. 404 error.  
    if( !$attachment_id ) {
        $wp->query_vars['error'] = '404';
        return;
    }

    // Get post from database 
    $file_post = get_post( $attachment_id );
    $file_path = get_attached_file( $attachment_id );

    if( !$file_post || !$file_path || !file_exists( $file_path ) ) {
        $wp->query_vars['error'] = '404';
        return;
    }

    // Logic for validating current user's access to this file...
    // Option A: check for user capability
    if( !current_user_can( 'required_capability' ) ) {
        $wp->query_vars['error'] = '404';
        return;
    }

    // Option B: check against current user
    if( $current_user->user_login == "authorized_user" ) {
        $wp->query_vars['error'] = '404';
        return;
    }

    // Everything checks out, user can see this file. Simulate headers and go:
    header( 'Content-Type: ' . $file_post->post_mime_type );
    header( 'Content-Dispositon: attachment; filename="'. basename( $file_path ) .'"' );
    header( 'Content-Length: ' . filesize( $file_path ) );

    echo file_get_contents( $file_path );
    die(0);
}
add_action( 'wp', 'intercept_file_request' );

एनबी यह समाधान केवल एकल-साइट इंस्टॉल के लिए काम करता है ! इसका कारण यह है कि वर्डप्रेस एमयू पहले से ही उप-साइटों में फ़ाइल अनुरोधों को फॉरवर्ड करता है wp-includes/ms-files.php। वर्डप्रेस एमयू के लिए भी एक समाधान है, लेकिन यह थोड़ा अधिक शामिल है।


1
नमस्ते वहाँ, मुझे नहीं लगता कि आप इस फ़ंक्शन को चरण में हुक करते हैं intercept_file_requestया जिसे कहीं भी बुलाया जा रहा है, उस फ़ंक्शन को कैसे निकाल दिया जाता है?
बोबज़

अच्छी बात है, इसे हुक किया जाना चाहिए wp, मैंने उदाहरण को अपडेट किया है।
बेंदोह

3

मुझे हाल ही में एक संबंधित समस्या हुई है और इसके बारे में यह लेख लिखा है

मुझे लगता है कि डाउनलोड वर्डप्रेस मीडिया हैंडलिंग के माध्यम से अपलोड किए गए हैं - या अन्यथा आपके पास डाउनलोड के लिए एक अनुलग्नक आईडी है।

समाधान की रूपरेखा

  • अपलोड निर्देशिका 'सुरक्षित' हैं (इस अर्थ में मैं सिर्फ मतलब उपयोग .htaccessअपलोड निर्देशिका में फ़ाइलों के सीधे उपयोग करने के लिए किसी भी प्रयास को (या किसी उप-निर्देशिका तत्संबंधी ब्लॉक करने के लिए) - जैसे के माध्यम से mysite.com/wp-content/uploads/conf/2012/09/myconfidentialfile.pdf)
  • अटैचमेंट आईडी सहित एक डाउनलोड लिंक बनाएं - यह वर्डप्रेस के माध्यम से उपयोगकर्ता की अनुमति की जांच करने के लिए अटैचमेंट / एक्सेस से इनकार करता है।

चेतावनियां

  • यह .htaccessसुरक्षा प्रदान करने के लिए उपयोग करता है । यदि यह उपलब्ध नहीं है (उदाहरण के लिए nginx सर्वर) चालू है, तो आपको अधिक सुरक्षा नहीं मिलेगी। आप उपयोगकर्ता को uplods निर्देशिका ब्राउज़ करने से रोक सकते हैं । लेकिन सीधी पहुंच काम करेगी।
  • ऊपर के अनुसार। वितरण में इसका उपयोग नहीं किया जाना चाहिए यदि आपको पूर्ण सुरक्षा की आवश्यकता है । यह ठीक है अगर आपका विशिष्ट सेट अप काम करता है - लेकिन सामान्य तौर पर, इसकी गारंटी नहीं दी जा सकती है। मेरा जुड़ा लेख इसे संबोधित करने की कोशिश में है।
  • आप थंबनेल ढीला कर देंगे । किसी फ़ोल्डर या उप-फ़ोल्डर में सीधे पहुंच को अवरुद्ध करने का मतलब होगा कि उस फ़ोल्डर में फ़ाइलों के थंबनेल को नहीं देखा जा सकता है। मेरा जुड़ा लेख इसे संबोधित करने के प्रयास में है।

सीधे पहुंच को अवरुद्ध करना

अपने अपलोड फ़ोल्डर में ऐसा करने के लिए (या सबफ़ोल्डर - सभी गोपनीय सामग्री को इस फ़ोल्डर के अंदर, किसी भी गहराई पर रहना चाहिए)। .htaccessनिम्नलिखित के साथ एक फ़ाइल रखें :

Order Deny,Allow
Deny from all

निम्नलिखित में मैं मान रहा हूँ कि आप 'क्लाइंट' टाइप करने के लिए गोपनीय सामग्री संलग्न करेंगे। क्लाइंट-एडिट पेज पर अपलोड किए गए किसी भी मीडिया को uploads/conf/फ़ोल्डर में संग्रहीत किया जाएगा

सुरक्षित अपलोड निर्देशिका को सेटअप करने का कार्य

function wpse26342_setup_uploads_dir(){

    $wp_upload_dir = wp_upload_dir();
    $protected_folder = trailingslashit($wp_upload_dir['basedir']) . 'conf';    

    // Do not allow direct access to files in protected folder
    // Add rules to /uploads/conf/.htacess
    $rules = "Order Deny,Allow\n";
    $rules .= "Deny from all";

    if( ! @file_get_contents( trailingslashit($protected_folder).'.htaccess' ) ) {
            //Protected directory doesn't exist - create it.
        wp_mkdir_p( $protected_folder);
    }
    @file_put_contents( trailingslashit($protected_folder).'.htaccess', $rules );

     //Optional add blank index.php file to each sub-folder of protected folder.
}

गोपनीय सामग्री अपलोड करना

   /**
    * Checks if content is being uploaded on the client edit-page
    * Calls a function to ensure the protected file has the .htaccess rules
    * Filters the upload destination to the protected file
    */
    add_action('admin_init', 'wpse26342_maybe_change_uploads_dir', 999);
    function wpse26342_maybe_change_uploads_dir() {
        global $pagenow;

        if ( ! empty( $_POST['post_id'] ) && ( 'async-upload.php' == $pagenow || 'media-upload.php' == $pagenow ) ) {
                if ( 'client' == get_post_type( $_REQUEST['post_id'] ) ) {
                       //Uploading content on the edit-client page

                       //Make sure uploads directory is protected
                       wpse26342_setup_uploads_dir();

                       //Change the destination of the uploaded file to protected directory.
                       add_filter( 'upload_dir', 'wpse26342_set_uploads_dir' );
                }
        }

    }

ऐसा करने के बाद, अपलोड की गई सामग्री अंदर होनी चाहिए uploads/confऔर अपने ब्राउज़र का उपयोग करके इसे सीधे एक्सेस करने का प्रयास करना चाहिए।

डाउनलोड करने की सामग्री

यह आसान है। डाउनलोड यूआरएल कुछ हो सकता है www.site.com?wpse26342download=5(जहां 5 अपलोड की गई सामग्री की अनुलग्नक आईडी है)। हम इसका उपयोग अटैचमेंट की पहचान करने, वर्तमान उपयोगकर्ता की अनुमतियों की जांच करने और उन्हें डाउनलोड करने की अनुमति देने के लिए करते हैं।

सबसे पहले, क्वेरी चर सेट अप करें

/**
 * Adds wpse26342download to the public query variables
 * This is used for the public download url
 */
add_action('query_vars','wpse26342_add_download_qv');
function wpse26342_add_download_qv( $qv ){
    $qv[] = 'wpse26342download';
    return $qv;
}}

अब (शायद) डाउनलोड करने के लिए ट्रिगर एक श्रोता सेट ...

add_action('request','wpse26342_trigger_download');
function wpse26342_trigger_download( $query_vars ){

        //Only continue if the query variable set and user is logged in...
    if( !empty($query_vars['wpse26342download']) && is_user_logged_in() ){

        //Get attachment download path
        $attachment = (int) $query_vars['wpse26342download'];
        $file = get_attached_file($attachment);

        if( !$file )
             return;

        //Check if user has permission to download. If not abort.       
        header('Content-Description: File Transfer');
        header('Content-Type: application/octet-stream');
        header('Content-Disposition: attachment; filename='.basename($file));
        header('Content-Transfer-Encoding: binary');
        header('Expires: 0');
        header('Cache-Control: must-revalidate, post-check=0, pre-check=0');
        header('Pragma: public');
        header('Content-Length: ' . filesize($file));

        ob_clean();
        flush();
        readfile($file);
        exit();
    }
    return $query_vars;
}

अंतिम टिप्पणियाँ

ऊपर दिए गए कोड में बग / वाक्यविन्यास त्रुटियां हो सकती हैं और यह अप्रयुक्त है, और आप इसे अपने जोखिम पर उपयोग करते हैं :)।

डाउनलोड यूआरएल को फिर से लिखना का उपयोग करके 'पूर्वनिर्धारित' किया जा सकता है। जैसा कि टिप्पणियों में कहा गया है कि आप index.phpब्राउज़िंग को रोकने के लिए संरक्षित फ़ोल्डर के प्रत्येक बच्चे के अंदर एक रिक्त जोड़ सकते हैं - लेकिन इसे .htaccessनियमों द्वारा वैसे भी रोका जाना चाहिए ।

सार्वजनिक निर्देशिका के बाहर सार्वजनिक फ़ाइलों को संग्रहीत करने के लिए एक अधिक सुरक्षित तरीका होगा। या Amazon S3 जैसी बाहरी सेवा पर। बाद के लिए आपको अमेज़ॅन (अपनी निजी कुंजी का उपयोग करके) से फ़ाइल लाने के लिए एक वैध url उत्पन्न करना होगा। इन दोनों को आपकी होस्ट / थर्ड पार्टी सेवा में एक निश्चित स्तर के विश्वास की आवश्यकता होती है।

मैं किसी भी प्लग-इन का उपयोग करने के बारे में सावधान रहूंगा जो सुझाव देगा कि वे 'संरक्षित डाउनलोड' प्रदान करते हैं। मुझे कोई ऐसा नहीं मिला है जो पर्याप्त सुरक्षा प्रदान करे। कृपया इस समाधान का विवरण भी न दें - और मैं किसी भी सुझाव या आलोचना का स्वागत करूंगा।


1

शायद, आप इस चाल को जानते होंगे, यह कोड उपयोगकर्ता के उपयोगकर्ता नाम में वर्तमान लॉग के लिए जाँच करेगा और यदि यह मेल खाता है तो उस फ़ाइल का डाउनलोड लिंक दिखाएगा, अन्यथा यह कुछ भी नहीं दिखाएगा।

यहाँ कोड है:

<?php 
    global $current_user;
    get_currentuserinfo();

    if ( 'username' == $current_user->user_login ) {
        echo 'Download Link';
    } else {
        // nothing
    }
?>

हालांकि, यह एक अच्छा तरीका नहीं होगा, क्योंकि फाइलें सर्वर पर स्टोर होती हैं, लिंक वाले कोई भी व्यक्ति उस फाइल को डाउनलोड कर सकता है।


0

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

अमेज़ॅन एस 3 पर फ़ाइलों को सुरक्षित रूप से संग्रहीत करने पर ध्यान दें और फिर फ़ाइल पर पूर्व हस्ताक्षरित (समय सीमित) URL प्रदान करें, बशर्ते कि सही सुरक्षा जांच संतुष्ट हो गई है (यानी उपयोगकर्ता ने आपकी साइट में लॉग इन किया है और वे कहते हैं कि वे कौन हैं)।

एक बहुत अच्छा AWS SDK है जो इसे करने के लिए बहुत सीधे आगे बनाता है।

आपको इसकी आवश्यकता है कि आपको S3 में WP अपलोड इंटरफ़ेस के माध्यम से अपलोड की गई फ़ाइलों को भेजने की आवश्यकता है, इसके बजाय वैकल्पिक रूप से अपना अपलोडर बनाएं

एक अन्य विकल्प भी WP ई-कॉमर्स के कोड में दिखेगा । वे सॉफ्टवेयर फ़ाइलों (जैसे MP3) का सुरक्षित डाउनलोड प्रदान करते हैं। मेरा मानना ​​है कि फ़ाइलों को एन्क्रिप्शन कुंजी के साथ हैश में परिवर्तित किया जाता है जो कि खरीद पर प्रति उपयोगकर्ता उत्पन्न होता है। यह देखने के लिए कि यह कैसे काम करता है, कुछ डिक्रिप्शन लेगा, लेकिन यह प्रक्रिया इस प्लगइन के लिए अद्वितीय नहीं होगी इसलिए अन्य उदाहरण उपलब्ध होंगे (कहीं न कहीं)।


0

मुझे लगता है कि फाइलों का एन्क्रिप्शन उपरोक्त उत्तर की तरह जाने का तरीका है। Wordpress.org पर एक प्लगइन है जो आपको डाउनलोड की सुरक्षा करने देता है। http://wordpress.org/extend/plugins/download-protect/ आप amazons सेवा या Google ड्राइव का उपयोग कर सकते हैं। कई सेवाएं सुरक्षित डाउनलोड प्रदान करती हैं जैसे ड्रॉप बॉक्स भी।


अस्पष्टता के माध्यम से सुरक्षा एक बुरा दृष्टिकोण है। कोई भी http अनुरोध देखने और इस तरह से यूआरएल प्राप्त करने में सक्षम होगा।
mulllhausen
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.