Son zamanlarda ilgili bir sorun yaşadım ve bu makaleyi yazdım .
İndirmelerin WordPress'in medya kullanımı yoluyla yüklendiğini varsayacağım - aksi takdirde indirme için bir ek kimliğiniz var.
Çözümün ana hatları
- (Bu anlamda yüklemeler dizin 'güvenli' Make sadece ortalama kullanım
.htaccess
- örn yoluyla) yüklenenler dizindeki dosyaların doğrudan erişmek için herhangi bir girişimde (ya da bunların bir alt dizini engellemek için mysite.com/wp-content/uploads/conf/2012/09/myconfidentialfile.pdf
)
- Ek kimliği içeren bir indirme bağlantısı oluşturun - bu, kullanıcının eki görüntüleme iznini kontrol etmek için WordPress üzerinden geçmesine izin verir / erişimi engeller.
Uyarılar
- Bu
.htaccess
güvenlik sağlamak için kullanır . Bu kullanılamıyorsa / açık değilse (örneğin nginx sunucuları), fazla güvenlik elde edemezsiniz. Kullanıcının uplods dizinine göz atmasını önleyebilirsiniz . Ancak doğrudan erişim işe yarayacaktır.
- Yukarıdaki gibi. Mutlak güvenliğe ihtiyacınız varsa, dağıtımda kullanılmamalıdır . Özel kurulumunuz işe yararsa iyi olur - ancak genel olarak garanti edilemez. Bağlantılı makalem kısmen bunu ele almaya çalışıyor.
- Küçük resimleri kaybedeceksiniz . Bir klasöre veya alt klasöre doğrudan erişimi engellemek, o klasördeki dosyaların küçük resimlerinin görüntülenemeyeceği anlamına gelir. Bağlantılı makalem kısmen bunu ele almaya çalışıyor.
Doğrudan erişimi engelleme
Bunu yüklemeler klasörünüzde (veya bir alt klasörde) yapmak için tüm gizli materyallerin herhangi bir derinlikte, bu klasörün içinde bulunması gerekir). .htaccess
Aşağıdakileri içeren bir dosya yerleştirin:
Order Deny,Allow
Deny from all
Aşağıda yazı tipi 'müşteri'ye gizli materyal ekleyeceğinizi varsayıyorum. İstemci düzenleme sayfasına yüklenen ortamlar uploads/conf/
klasörde saklanır
Korumalı yüklemeler dizinini ayarlama işlevi
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.
}
Gizli materyal yükleme
/**
* 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' );
}
}
}
Bunu yaptıktan sonra, yüklenen içerik içeride olmalı uploads/conf
ve tarayıcınızı kullanarak doğrudan erişmeye çalışmamalı.
İçerik İndirme
Bu kolay. İndirme URL'si bir şey olabilir www.site.com?wpse26342download=5
(burada 5, yüklenen içeriğin ek kimliğidir). Bunu, eki tanımlamak, geçerli kullanıcının izinlerini kontrol etmek ve indirmelerine izin vermek için kullanırız.
İlk olarak, sorgu değişkenini ayarlayın
/**
* 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;
}}
Şimdi indirmeyi tetiklemek için (belki) bir dinleyici ayarlayın ...
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;
}
Son Yorumlar
Yukarıdaki kod hatalar / sözdizimi hataları içerebilir ve test edilmemiştir ve bunu kullanmak kendi sorumluluğunuzdadır :).
İndirme URL'si, yeniden yazma işlemleri kullanılarak 'önizlenebilir'. Yorumlarda belirtildiği gibi, index.php
taramayı önlemek için korumalı klasörün her altına bir boşluk ekleyebilirsiniz - ancak bu .htaccess
yine de kurallar tarafından engellenmelidir .
Daha güvenli bir yöntem, genel dosyaları bir genel dizinin dışında saklamaktır. Veya Amazon S3 gibi harici bir hizmette. İkincisi için, dosyayı Amazon'dan almak için geçerli bir URL oluşturmanız gerekir (özel anahtarınızı kullanarak). Bunların her ikisi de Ana Bilgisayar / üçüncü taraf hizmetinize belirli bir güven düzeyi gerektirir.
'Korumalı indirmeler' sunduklarını öneren herhangi bir eklentiyi kullanma konusunda dikkatli olurum. Yeterince iyi güvenlik sağlayan bir şey bulamadım. Lütfen bu çözümün uyarılarını da dikkate almayın - herhangi bir öneri veya eleştiriyi memnuniyetle karşılarım.