2017-06-06 7 views
0

Ich verwende einen Gist von Github, um nur eingeloggte Benutzer auf Bilder im WP-Content/Uploads-Ordner zu beschränken. Jetzt funktioniert das Skript für den Login-Teil, aber wenn es eingeloggt ist, ist das zurückgegebene Bild ungültig. Wenn ich das zurückgegebene Bild inspiziere, sehe ich eine Dateigröße, die ok ist, gute Inhaltsheader. Aber es ist immer noch eine beschädigte Datei.Wordpress-Uploads sind auf angemeldete Benutzer beschränkt.

https://gist.github.com/hakre/1552239 

Verwenden der neuesten WP-Version.

Weiß jemand, wo ich in dieses Skript schauen sollte?

<?php 
/* 
* dl-file.php 
* 
* Protect uploaded files with login. 
* 
* @link http://wordpress.stackexchange.com/questions/37144/protect-  wordpress-uploads-if-user-is-not-logged-in 
* 
* @author hakre <http://hakre.wordpress.com/> 
* @license GPL-3.0+ 
* @registry SPDX 
*/ 
ob_start(); 
require_once('wp-load.php'); 
require_once ABSPATH . WPINC . '/formatting.php'; 
require_once ABSPATH . WPINC . '/capabilities.php'; 
require_once ABSPATH . WPINC . '/user.php'; 
require_once ABSPATH . WPINC . '/meta.php'; 
require_once ABSPATH . WPINC . '/post.php'; 
require_once ABSPATH . WPINC . '/pluggable.php'; 
wp_cookie_constants(); 
ob_end_clean(); 
ob_end_flush(); 

is_user_logged_in() || auth_redirect(); 

list($basedir) = array_values(array_intersect_key(wp_upload_dir(),     array('basedir' => 1)))+array(NULL); 

$file = rtrim($basedir,'/').'/'.str_replace('..', '', isset($_GET[ 'file'  ])? ''.$_GET[ 'file' ]:''); 

if (!$basedir || !is_file($file)) { 
status_header(404); 
wp_redirect(home_url()); 
exit(); 
} 

$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); 
+1

Überprüfen Sie die tatsächlichen „Bilddaten“ von Ihrem Skript zurückgegeben - es enthält wahrscheinlich mehr als das - PHP-Fehlermeldungen , andere unbeabsichtigte Ausgabe, ... – CBroe

+0

Dank gute Rückmeldung. Behoben. – user983511

Antwort

0

behoben, indem die ReadFile- Modifizierung nur eine saubere Ausgabe der Datei zurück:

while (ob_get_level()) { 
ob_end_clean(); 
} 
readfile($file); 
exit(); 
Verwandte Themen