আপলোডগুলি কীভাবে সুরক্ষিত করবেন, যদি ব্যবহারকারী লগ ইন না হন?


79

আমি কোনও ব্যক্তিগত সাইটের জন্য ওয়ার্ডপ্রেস ব্যবহার করি যেখানে ব্যবহারকারীরা ফাইল আপলোড করেন। যদি ব্যবহারকারী লগ ইন না করে থাকেন তবে সাইটে অ্যাক্সেস রোধ করতে আমি "ব্যক্তিগত ওয়ার্ডপ্রেস" ব্যবহার করি।

আমি আপলোড ফোল্ডারে আপলোড করা ফাইলগুলিতেও এটি করতে চাই।

সুতরাং যদি কোনও ব্যবহারকারী এটির লগইন না করে থাকে তবে তারা সেগুলিতে অ্যাক্সেস করতে পারবেন না: https://xxxxxxx.com/wp-content/uploads/2011/12/xxxxxxx.pdf যদি তারা অ্যাক্সেস করার চেষ্টা করে তবে তারা লগইন না করে তবে তাদের উচিত উদাহরণস্বরূপ লগইন পৃষ্ঠাতে পুনঃনির্দেশ করুন।

আমি প্রাইভেট ফাইল নামে একটি প্লাগইন পেয়েছি কিন্তু শেষ বার আপডেট হয়েছিল ২০০৯ সালে এবং এটি আমার ওয়ার্ডপ্রেসে কাজ করে না বলে মনে হয়।

কেউ কোন পদ্ধতি জানেন? হটলিঙ্ক পদ্ধতিটি কি এটি রক্ষা করতে যথেষ্ট হবে?

আমি এই পদ্ধতিটিও পেয়েছি:

# 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

সত্যিই নয় তবে আমি ইতিমধ্যে সেই ডিরেক্টরিতে থাকা পোস্টগুলির সাথে প্রচুর সংখ্যক ফাইল সংযুক্ত করেছি, আমি যদি সঠিক সমাধান খুঁজে
পাই

উত্তর:


86

কেবল কুকি রয়েছে কিনা তা যাচাই করা খুব কঠোর সুরক্ষা নয়।

আরও শক্তিশালী সুরক্ষা পেতে, আপনি uploadsপিএইচপি স্ক্রিপ্টের মাধ্যমে আপলোড করা ফোল্ডারে ( নীচের উদাহরণে অনুকরণীয় ) সমস্ত অনুরোধগুলি "প্রক্সী" পাস করতে পারেন :

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আপনার ওয়ার্ডপ্রেস ইনস্টলেশনতে পাওয়া যেতে পারে তবে এটি মাল্টিসাইট এবং ডাব্লু / ও লগইন চেক এবং পুনর্নির্দেশগুলির জন্য।

আপনার কতটা ট্র্যাফিক রয়েছে তার উপর নির্ভর করে এটি আপনার সার্ভারের সাথে উদাহরণস্বরূপ X-Accel-Redirectবা X-Sendfileশিরোলেখগুলির সাথে আরও ভাল সংহত করা বুদ্ধিমানের কাজ হতে পারে ।


1
আমি কীভাবে dl-file.php সামঞ্জস্য করতে পারি যদি আমি ডাব্লুপি-কনটেন্ট / আপলোডস / সুরক্ষার মতো সাব-ডিরেক্টরিতে ফাইল সঞ্চয় করতে চাই?

এটিই কেবলমাত্র নিরাপদ সমাধান। আপনি ওয়েবে আর কিছু খুঁজে পেতে পারেন যেমন রেফারার শিরোলেখ পরীক্ষা করা, কুকিজ যাচাই করা, ডিরেক্টরি তালিকা বঞ্চিত করা, এটি একটি অর্ধ পরিমাপ যেহেতু আপনি সহজেই এইচটিটিপি অনুরোধ শিরোনামকে ঘিরে ফেলতে পারেন।
লুক

বলছি..এটি আমার কাছে নিখুঁত সমাধানের মতো মনে হয়েছিল .... সমস্যাটি হ'ল, আমি আপলোড ফোল্ডার থেকে কিছু পিডিএফ অ্যাক্সেস করতে মোজিলা থেকে পিডিএফএস ব্যবহার করছি এবং পিডিএফজেএস কেবল আগ্রহী পৃষ্ঠাগুলি পেতে আংশিক-বিষয়বস্তু শিরোনাম ব্যবহার করে .. সুতরাং এই সমাধানটি আমার পক্ষে কোনও পদক্ষেপ নেই। কোনও পরামর্শ??
অটো ন্যাসকারেলা

@ অটো নাসকেইর্লা: পিএইচপি-তে আংশিক সামগ্রী অনুরোধগুলি আজকের মতো সমাধান করা হয়েছে, এটি এই ওয়ার্ডপ্রেস প্রশ্নের স্বাধীন। প্রকৃতপক্ষে, প্রশ্নটি ইতিমধ্যে বেশ পুরানো: ফাইলটি প্রেরণের জন্য পিএইচপি ব্যবহার করার সময় ডাউনলোডগুলি পুনঃসূচনাযোগ্য?
hakre

@hakre ওয়েবসাইটের প্রথম পৃষ্ঠায় ব্যবহার করা এমন কিছু চিত্রের বিষয়ে এবং কোনও ব্যবহারকারী সাইট দেখার জন্য এসেছেন? আমি লগইন না থাকলে এটি আমাকে 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;
}

এটি আমার পক্ষে কাজ করে না কেন কেউ জানেন কেন? আমি ঠিক কপি।
রায়ান এস

সুরক্ষা কাজ কেবল পিডিএফ। অন্যান্য ফাইলগুলির এক্সটেনশন যেমন কাজ করছে না: ডক, ডক্স, জেপিজি এবং ইত্যাদি ...
প্যাটেল

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: // ওয়ার্ডপ্রেস .org / প্লাগইন / সদস্য / , 'মেম্বার' নামে একটি নতুন ব্যবহারকারীর ভূমিকা তৈরি করুন এবং এটিকে 'পড়ুন' এর একক ক্ষমতা দিন, ওয়ার্ডপ্রেসে একটি নতুন ব্যবহারকারী তৈরি করুন এবং তাদেরকে 'সদস্য' এর ভূমিকা দেওয়ার বিষয়ে নিশ্চিত হন।

আপনি যদি পৃষ্ঠাগুলির বিষয়বস্তু সুরক্ষিত করতে চান তবে 'সদস্যদের' প্লাগইন কিছু বিকল্প সরবরাহ করে বা অন্য প্লাগইনগুলি সেখানে রয়েছে। আপনি যদি ওয়ার্ডপ্রেস ডিফল্ট লগইন ফর্মের চেয়ে ভাল দেখতে সদস্যদের লগইন পৃষ্ঠাটি থিম করতে চান তবে 'থিম মাই লগইন' এর মতো কিছু ব্যবহার করুন: https://wordpress.org/plugins/theme-my-login/


আমি উপরে বর্ণিত প্রক্রিয়াটিও এখানে ব্যাখ্যা করা হয়েছে, যদিও আপনি দেখতে পাচ্ছেন যে এটি কেবল পিডিএফ-তে নির্দিষ্ট হওয়া উচিত নয়: thedigitalcrowd.com/website-de વિકાસment
ম্যাটি জে
আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.