Placez les fichiers en dehors de la racine Web. Ensuite, en utilisant PHP, passez le fichier via un script. De cette façon, personne ne peut accéder directement au fichier et contourner vos contrôles. (Naturellement assurez-vous que le script qui fait cela uniquement après avoir vérifié que l'utilisateur a la permission de récupérer ce fichier).
Exemple PHP :
<?php
if (!isset($_SESSION['authenticated'])) {
exit;
}
$file = '/path/to/file/outside/www/secret.pdf';
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;
?>