আমি সম্প্রতি একটি সম্পর্কিত সমস্যা ছিল এবং এটি সম্পর্কে এই নিবন্ধটি লিখেছি ।
আমি ধরে নেব যে ডাউনলোডগুলি ওয়ার্ডপ্রেসের মাধ্যমে প্রচারিত হয়েছে মিডিয়া হ্যান্ডলিং - বা অন্যথায় ডাউনলোডের জন্য আপনার একটি সংযুক্তি আইডি রয়েছে 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 তৈরি করতে হবে (আপনার ব্যক্তিগত কী ব্যবহার করে)। এই উভয়েরই আপনার হোস্ট / তৃতীয় পক্ষের পরিষেবাতে একটি নির্দিষ্ট স্তরের আস্থা প্রয়োজন।
আমি যে কোনও প্লাগইনগুলি ব্যবহার করে যেগুলি 'সুরক্ষিত ডাউনলোডগুলি' অফার করে তা ব্যবহার সম্পর্কে সতর্ক থাকব। আমি যথেষ্ট সুরক্ষা সরবরাহ করে এমন কোনও পাইনি। দয়া করে এই সমাধানের সাবধানতাও না - এবং আমি কোনও পরামর্শ বা সমালোচনাকে স্বাগত জানাই।