Comment puis-je refuser tous les répertoires, mais toujours accéder aux fichiers avec des scripts comme PHP?

J’essaie de comprendre comment je peux empêcher les utilisateurs de regarder un fichier texte mais toujours accéder au fichier (en lecture) avec PHP? Est-il possible de faire cela avec htaccess? EDIT: Nouveau pour la sécurité des fichiers, je suis prêt à essayer quelque chose de nouveau!

Vous pouvez le faire facilement en mettant un fichier .htaccess dans le dossier que vous souhaitez bloquer. Ce contenu du .htaccess étant deny from all . Ensuite, votre serveur Web ne diffusera pas les pages, mais vous pourrez toujours y accéder avec fopen , file_get_contents ect.

Inutile d’utiliser htaccess pour cela: il suffit de lancer le nom du fichier avec un point et apache l’ignorera automatiquement par défaut. J’utilise cette astuce pour cacher des répertoires entiers de code php.

Par exemple, dans Vbulletin, j’utilise un simple fichier .htaccess pour protéger le dossier includes de la lisibilité de config.php. Vous pouvez créer un fichier .htaccess dans les répertoires que vous souhaitez protéger avec les éléments suivants:

  order deny,allow deny from all  

Je ne sais pas si le joker fonctionne, dans mon cas j’ai utilisé

  order deny,allow deny from all  

Bonne chance!

Bonne question et il y a un certain nombre de choses relativement simples que vous pouvez faire.

Par exemple, vous pouvez stocker un fichier texte sous votre répertoire public.

répertoire public serait quelque chose comme:

 /home/site_folder/public_html/ 

ci-dessous public serait quelque chose comme:

 /home/site_folder/key/ 

Par exemple un fichier appelé “key.ini” stocké sous public dans le sous-dossier de la clé avec le contenu suivant:

 [key] name="enter a name here" text="enter random text here" 

Vous pouvez appeler ceci en utilisant:

 $ini_file = "path_to_file/key.ini"; // ie /home/site_folder/key/key.ini $ini_array = parse_ini_file($ini_file); $name = $ini_array['name']; $text = $ini_array['text']; 

Mais alors, un fichier .ini n’est pas un texte. Si votre fichier texte était en dessous de public, il serait sécurisé de lire via une URL de la même manière que le fichier ini ci-dessus et vous pouvez le lire assez facilement, en supposant un fichier “password.txt”, comme ceci:

 $fh = fopen(password.txt,'r'); $password = fread($fh,100); fclose($fh); 

Si vous souhaitez sécuriser le contenu du fichier, vous pouvez utiliser une méthode asynchrone simple comme celle-ci pour chiffrer les données en même temps en utilisant le fichier key.ini ci-dessus comme clé de chiffrement :

 function getAesKey() { if ( file_exists(key.ini) ) { $args = parse_ini_file(key.ini); if ( isset($args['name']) AND isset($args['text']) ) { return md5( $args['name'].$args['text'] ); } } } function encrypt_data($data) { //AES256 symesortingc encryption $key = getAesKey(); if(32 !== strlen($key)) $key = hash('SHA256', $key, true); $padding = 16 - (strlen($data) % 16); $data .= str_repeat(chr($padding), $padding); return mcrypt_encrypt(MCRYPT_RIJNDAEL_128, $key, $data, MCRYPT_MODE_CBC, str_repeat("\0", 16)); } 

REMARQUE , une fois le fichier créé, vous souhaiterez peut-être modifier ses permissions en lecture seule.

Donc, quelque chose comme ça créerait le fichier et appendait du contenu crypté:

  $fh = fopen(password.txt, "w"); //Open for writing fwrite($fh, encrypt_data("My very secure password")); fclose($fp); 

La fonction pour décrypter le contenu:

 function decrypt_data($data) { $key = getAesKey(); if(32 !== strlen($key)) $key = hash('SHA256', $key, true); $data = mcrypt_decrypt(MCRYPT_RIJNDAEL_128, $key, $data, MCRYPT_MODE_CBC, str_repeat("\0", 16)); $padding = ord($data[strlen($data) - 1]); return substr($data, 0, -$padding); } 

Vous pouvez append une autre fonction pour retourner le contenu réel pour vous plutôt que d’écrire tout le code à chaque fois:

 function getPassword() { $fh = fopen(password.txt, 'r'); $password = fread($fh,100); fclose($fh); return decrypt_data($password); } 

Ce qui signifie que vous l’appelez comme ceci:

 $password = getPassword(); 

Le contenu de votre fichier de mot de passe, s’il était accessible, ressemblerait à ceci:

 v?  cr   bV  @ 

Avec le fichier ci-dessous public, personne ne sera en mesure de naviguer dans le fichier comme: http://www.votresite.com/text_file.txt pour le voir. Et s’ils accèdent en quelque sorte à votre serveur et trouvent le fichier de mot de passe: ils ne pourront pas déchiffrer le contenu chiffré sans la clé. Mais ils ne feraient probablement que sortir le contenu en utilisant votre fonction.

J’ai généralement mon fichier de classe de chiffrement et le fichier key.ini dans l’un des répertoires include, ce qui n’est pas disponible dans le chemin d’access du compte d’hébergement actuel. Pour y accéder, vous devez avoir un access root au serveur. De cette façon, si quelqu’un a une copie de tout votre code, il ne pourra pas déverrouiller le fichier sans le fichier de clé.