나는 최근에 관련된 문제가 있었고 그것에 대해이 기사를 썼습니다 .
다운로드는 WordPress의 미디어 처리를 통해 업로드 된 것으로 가정합니다. 그렇지 않으면 다운로드에 대한 첨부 파일 ID가 있습니다.
솔루션 개요
- (내가 이런 의미에서 업로드 디렉토리 '보안'확인 단지 평균 사용
.htaccess
- 예를 통해) 업로드 디렉토리에있는 파일의 직접 액세스 시도 (또는 그 하위 디렉토리를 차단할를 mysite.com/wp-content/uploads/conf/2012/09/myconfidentialfile.pdf
)
- 첨부 파일 ID를 포함하여 다운로드 링크를 만듭니다. WordPress를 통해 첨부 파일을 볼 수있는 사용자의 권한을 확인하여 액세스가 허용 / 거부됩니다.
경고
- 이것은
.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
브라우저를 사용하여 직접 액세스하려고 시도하면 안됩니다.
컨텐츠 다운로드
이것은 쉬워요. 다운로드 URL은 무언가 일 수 있습니다 www.site.com?wpse26342download=5
(여기서 5는 업로드 된 컨텐츠의 첨부 파일 ID입니다). 이를 사용하여 첨부 파일을 식별하고 현재 사용자의 권한을 확인한 후 다운로드 할 수 있습니다.
먼저 쿼리 변수를 설정하십시오.
/**
* 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;
}
최종 코멘트
위의 코드에는 버그 / 구문 오류가 포함되어있을 수 있으며 테스트되지 않았으므로 자신의 책임하에 사용해야합니다. :)
재 작성을 사용하여 다운로드 URL을 '미리 확인'할 수 있습니다. 주석에 명시된 바와 같이 index.php
탐색을 방지하기 위해 보호 된 폴더의 모든 자식 안에 공백을 추가 할 수 있지만 .htaccess
어쨌든 규칙에 의해 방지해야 합니다.
보다 안전한 방법은 공용 파일을 공용 디렉토리 외부에 저장하는 것입니다. 또는 Amazon S3와 같은 외부 서비스에서. 후자의 경우 유효한 개인 URL을 사용하여 Amazon에서 파일을 가져 오려면 유효한 URL을 생성해야합니다. 이 두 가지 모두 호스트 / 타사 서비스에 대한 특정 수준의 신뢰가 필요합니다.
'보호 된 다운로드'를 제공하는 플러그인을 사용하는 것에 대해 조심할 것입니다. 충분한 보안을 제공하는 제품을 찾지 못했습니다. 이 솔루션의주의 사항도주의하지 마십시오. 제안이나 비판을 환영합니다.