Hai due opzioni:

1. usi .htaccess per proteggere la cartella e i file. Il problema,dal mio punto di vista, è che gli utenti che possono accedere al file vanno gestiti tramite apache (il file .htpassword): Se registri gli utenti su un db, devi poi prevedere un sistema per aggiungerli al file della password di apache. Quindi te lo consiglierei se hai degli utenti "statici"

2. sposti i tuoi contenuti da proteggere fuori dalla root del sito, in una cartella cmq leggibile e scrivibile da php (in alternativa puoi ricorrere a .htaccess, punto 1, negando l'accesso a tutti).
A questo punto nessuno può accedere ai file, quindi ti prepari uno script php del tipo

readimg.php
Codice PHP:
<?php
session_start
();
$file $_GET['src'];
// Verifico se l'utente è loggato. Chiaramente puoi creare il tuo sistema di accesso, usando 
// anche il db
if(!isset($_SESSION['user'])){
      
header("HTTP/1.0 403 Forbidden");
      ....
      exit();
}  
$file_path $path_assoluto_cartella.$file;
if(!
file_exists($file_path)){
     
header("HTTP/1.0 404 Not Found");
     ...
     exit();
}

// Come content-type, sarebbe meglio prendere il MIME del file
header('Content-Type: application/octet-stream');
header('Content-Length: ' filesize($file_path));

readfile($file_path);

?>
quindi se vuoi far visualizzare l'immagine basta fare

Codice PHP:
[img]/path/readimg.php?src=logo.png[/img
Se l'utente è abilitato ed il file esiste nella cartella privata allora verrà visualizzato