কোনও নির্দিষ্ট ব্যবহারকারীর সাথে সংযুক্তি ডাউনলোডকে কীভাবে সীমাবদ্ধ করবেন?


12

আমার খুব সুনির্দিষ্ট ব্যবহারের কেস রয়েছে যেখানে কোনও আইনজীবীর জন্য নির্মিত সাইট এবং তার প্রতিটি ক্লায়েন্ট ডব্লিউপি-অ্যাডমিন ইত্যাদি অ্যাক্সেস করার ক্ষমতা ছাড়াই তাদের নিজস্ব 'নির্দিষ্ট পৃষ্ঠা / পোর্টাল' (কাস্টম পোস্টের ধরণ) এ লগইন করতে পারে (আমি সমস্ত তৈরি করেছি সামনের প্রান্তে লগইন / নিবন্ধন / প্রোফাইল-সম্পাদনা পৃষ্ঠা)। এই পৃষ্ঠায় / পোর্টালে আইনজীবী ক্লায়েন্টের ডাউনলোডের জন্য বার্তা এবং ফাইলগুলি ছেড়ে দেবে , এখন তাত্ত্বিকভাবে বলতে গেলে, একজন ক্লায়েন্ট অনুমান করতে পারে (বা যদি অন্য ক্লায়েন্টের ফাইলগুলির জ্ঞান থাকে) অন্য ফাইলের নাম এবং ডাউনলোড করতে পারে তবে গোপনীয়তা / সুরক্ষার সাথে একটি সমস্যা তৈরি করতে পারে / গোপনীয় উপাদান ইত্যাদি

আমি কোনও সমাধানের জন্য ধারণা / ধারণাগুলি খুঁজছি, আমার প্রাথমিক চিন্তাটি ছিল কিছু ডাউনলোডের জন্য ডাউনলোড লিঙ্ক পয়েন্ট p পিএফপি সংযুক্তি আইডি, ব্যবহারকারী আইডি, পৃষ্ঠা / পোর্টাল আইডি এবং ননস এবং অন্য প্রান্তে প্রসেসিংয়ে পাঠানো। ।

আপনি কি মনে করেন? আমি কি সঠিক পথে রয়েছি বা এই পদ্ধতির ত্রুটি আছে?

ধন্যবাদ!


আপনি কি এর জন্য কোনও সমাধান খুঁজে পেয়েছেন?
brasofilo

@ ব্রাজোফিলো, না ..
অমিত

উত্তর:


6

যা হওয়ার দরকার তা হ'ল ওয়ার্ডপ্রেসের মাধ্যমে আপনার ফাইল ফাইলগুলির জন্য প্রক্সি ডাউনলোডের অনুরোধ করা দরকার। ধরে নেওয়া যাক আপনি ".ডোক" ফাইলগুলিতে অ্যাক্সেস সীমাবদ্ধ করতে চলেছেন।

1. একটি ক্যোয়ারী ভেরিয়েবল সংজ্ঞায়িত করুন যা অনুরোধ করা ফাইলটি নির্দেশ করে

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

২. ওয়ার্ডপ্রেসে সীমাবদ্ধ ফাইলগুলির জন্য অনুরোধগুলি ফরোয়ার্ড করার জন্য .htaccess আপডেট করুন

এটি আপনার সীমাবদ্ধ করতে চান এমন ফাইলগুলিতে অনুরোধগুলি ক্যাপচার করবে এবং উপরের কাস্টম ক্যোয়ারী ভেরিয়েবলটি ব্যবহার করে তাদের ওয়ার্ডপ্রেসে ফেরত পাঠাবে। 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

আমি সম্প্রতি একটি সম্পর্কিত সমস্যা ছিল এবং এটি সম্পর্কে এই নিবন্ধটি লিখেছি

আমি ধরে নেব যে ডাউনলোডগুলি ওয়ার্ডপ্রেসের মাধ্যমে প্রচারিত হয়েছে মিডিয়া হ্যান্ডলিং - বা অন্যথায় ডাউনলোডের জন্য আপনার একটি সংযুক্তি আইডি রয়েছে have

সমাধানের রূপরেখা

  • আপলোড ডিরেক্টরির 'নিরাপদ' করে তোলার জন্য (এই অর্থে আমি শুধু গড় ব্যবহারের .htaccessআপলোড ডিরেক্টরির মধ্যে ফাইলের সরাসরি অ্যাক্সেস করতে কোনো প্রচেষ্টা (বা উপ-ডিরেক্টরি উহার ব্লক করতে) - যেমন মাধ্যমে mysite.com/wp-content/uploads/conf/2012/09/myconfidentialfile.pdf)
  • সংযুক্তি আইডি সহ একটি ডাউনলোড লিঙ্ক তৈরি করুন - এটি সংযুক্তি দেখার অনুমতি ব্যবহারকারীর অ্যাক্সেসের অনুমতি / অস্বীকার করার জন্য ওয়ার্ডপ্রেসের মাধ্যমে যায়।

আদেশ সহকারে

  • এটি .htaccessসুরক্ষা সরবরাহ করতে ব্যবহার করে । যদি এটি উপলভ্য / চালু না হয় (উদাহরণস্বরূপ এনজিনেক্স সার্ভার), তবে আপনি খুব বেশি সুরক্ষা পাবেন না। আপনি ব্যবহারকারী আপডলস ডিরেক্টরিটি ব্রাউজ করতে বাধা দিতে পারেন । তবে সরাসরি অ্যাক্সেস কাজ করবে।
  • উপরে হিসাবে। আপনার যদি নিখুঁত সুরক্ষার প্রয়োজন হয় তবে এটি বিতরণে ব্যবহার করা উচিত নয় । আপনার নির্দিষ্ট সেট আপটি যদি কাজ করে তবে এটি ঠিক আছে - তবে সাধারণভাবে, এটির নিশ্চয়তা দেওয়া যায় না। আমার লিঙ্কিত নিবন্ধটি এটিকে সমাধান করার চেষ্টা করছে।
  • আপনি থাম্বনেইস আলগা হবে । কোনও ফোল্ডার বা উপ-ফোল্ডারে সরাসরি অ্যাক্সেস ব্লক করার অর্থ এই ফোল্ডারের ফাইলগুলির থাম্বনেইলগুলি দেখা যায় না। আমার লিঙ্কিত নিবন্ধটি এটিকে সম্বোধন করার চেষ্টা করছে।

সরাসরি অ্যাক্সেস অবরুদ্ধ

আপনার আপলোড ফোল্ডারে এটি করতে (বা একটি সাবফোল্ডার - সমস্ত গোপনীয় উপাদান অবশ্যই এই ফোল্ডারের অভ্যন্তরে, কোনও গভীরতায় থাকতে হবে)। .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যাইহোক নিয়ম দ্বারা এটি প্রতিরোধ করা উচিত ।

একটি আরও সুরক্ষিত পদ্ধতি হ'ল পাবলিক ডিরেক্টরিগুলির বাইরে পাবলিক ফাইলগুলি সংরক্ষণ করা। অথবা অ্যামাজন এস 3 এর মতো বাহ্যিক পরিষেবাতে। পরবর্তীগুলির জন্য আপনাকে অ্যামাজন থেকে ফাইল আনার জন্য একটি বৈধ url তৈরি করতে হবে (আপনার ব্যক্তিগত কী ব্যবহার করে)। এই উভয়েরই আপনার হোস্ট / তৃতীয় পক্ষের পরিষেবাতে একটি নির্দিষ্ট স্তরের আস্থা প্রয়োজন।

আমি যে কোনও প্লাগইনগুলি ব্যবহার করে যেগুলি 'সুরক্ষিত ডাউনলোডগুলি' অফার করে তা ব্যবহার সম্পর্কে সতর্ক থাকব। আমি যথেষ্ট সুরক্ষা সরবরাহ করে এমন কোনও পাইনি। দয়া করে এই সমাধানের সাবধানতাও না - এবং আমি কোনও পরামর্শ বা সমালোচনাকে স্বাগত জানাই।


1

সম্ভবত, আপনি সম্ভবত এই কৌশলটি জানেন,

কোডটি এখানে:

<?php 
    global $current_user;
    get_currentuserinfo();

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

তবে এটি ভাল পন্থা হবে না, যেহেতু ফাইলগুলি সার্ভারে সংরক্ষণ করা হয়, লিঙ্কযুক্ত যে কেউ ফাইলটি ডাউনলোড করতে পারে।


0

আমি ধারণা করি যে এই তথ্যটি গোপনীয় এবং সেইজন্য ফাইলগুলির লিঙ্কগুলি গোপন করার পাশাপাশি আপনি ওয়েবে যে কারও কাছে ইউআরএল অনুমান করার পরেও এগুলি সম্পূর্ণরূপে অ্যাক্সেসযোগ্য করে তুলতে চাইবেন, যদি না সেই ব্যবহারকারীটির ডাউনলোডের স্পষ্ট অনুমতি না থাকে ফাইলগুলো.

সুরক্ষিতভাবে অ্যামাজন এস 3 এ ফাইলগুলি সংরক্ষণ করে তারপরে ফাইলটিতে প্রাক স্বাক্ষরিত (সময় সীমাবদ্ধ) ইউআরএল সরবরাহ করার জন্য সঠিক সুরক্ষা চেকগুলি সন্তুষ্ট হয়ে গেছে (যেমন ব্যবহারকারী আপনার সাইটে লগইন করেছেন এবং তারা কে তারা বলছেন)।

একটি খুব ভাল AWS SDK রয়েছে যা এটি এটির জন্য সরাসরি সরাসরি এগিয়ে দেয়।

আপনার কী গবেষণার দরকার তা হ'ল ডাব্লুপি আপলোড ইন্টারফেসের মাধ্যমে আপলোড করা ফাইলগুলি S3 এর পরিবর্তে কীভাবে প্রেরণ করা যায়, বিকল্পভাবে নিজের আপলোডার তৈরি করুন ।

অন্য বিকল্পগুলি ডাব্লুপি ই-কমার্সের কোডটিও সন্ধান করবে । তারা সফ্টওয়্যার ফাইলগুলি (যেমন এমপি 3) নিরাপদে ডাউনলোডের অফার করে। আমি বিশ্বাস করি যে ফাইলগুলি ক্রয় করার সময় প্রতিটি ব্যবহারকারী তৈরি করা একটি এনক্রিপশন কী দিয়ে হ্যাশগুলিতে রূপান্তরিত হয়। এটি কীভাবে কাজ করেছে তা দেখতে কিছুটা সিদ্ধান্ত গ্রহণ করতে হবে, তবে প্রক্রিয়াটি এই প্লাগইনটির পক্ষে অনন্য হবে না যাতে অন্যান্য উদাহরণ (কোথাও) উপলব্ধ available


0

আমি মনে করি ফাইলগুলির এনক্রিপশন হল উপরের উত্তরের মতো যাওয়ার উপায়। ওয়ার্ডপ্রেস.আর.জে একটি প্লাগইন রয়েছে যা আপনাকে ডাউনলোডগুলি সুরক্ষিত করতে দেয়। http://wordpress.org/extend/plugins/download-protect/ আপনি পাশাপাশি অ্যামাজন পরিষেবা বা গুগল ড্রাইভ ব্যবহার করতে পারেন। ড্রপ বক্সের মতো সুরক্ষিত ডাউনলোডগুলি সরবরাহ করে এমন প্রচুর পরিষেবা রয়েছে।


অস্পষ্টতার মাধ্যমে সুরক্ষা একটি খারাপ পদ্ধতির। যে কেউ এই ভাবে http অনুরোধটি দেখতে এবং url পেতে সক্ষম হবেন।
মুল্লহাউসন
আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.