मुझे हाल ही में एक संबंधित समस्या हुई है और इसके बारे में यह लेख लिखा है ।
मुझे लगता है कि डाउनलोड वर्डप्रेस मीडिया हैंडलिंग के माध्यम से अपलोड किए गए हैं - या अन्यथा आपके पास डाउनलोड के लिए एक अनुलग्नक आईडी है।
समाधान की रूपरेखा
- अपलोड निर्देशिका 'सुरक्षित' हैं (इस अर्थ में मैं सिर्फ मतलब उपयोग
.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 उत्पन्न करना होगा। इन दोनों को आपकी होस्ट / थर्ड पार्टी सेवा में एक निश्चित स्तर के विश्वास की आवश्यकता होती है।
मैं किसी भी प्लग-इन का उपयोग करने के बारे में सावधान रहूंगा जो सुझाव देगा कि वे 'संरक्षित डाउनलोड' प्रदान करते हैं। मुझे कोई ऐसा नहीं मिला है जो पर्याप्त सुरक्षा प्रदान करे। कृपया इस समाधान का विवरण भी न दें - और मैं किसी भी सुझाव या आलोचना का स्वागत करूंगा।