Защищенный паролем каталог и файлы в PHP

Im создает простую личную страницу со ссылками на некоторые файлы для загрузки. Я сделал это с простым управлением сеансом, но у меня есть проблема: если кто-то нажимает на файл-url, он может загрузить файл без аутентификации. Так что я могу сделать, чтобы этого избежать? Я могу сделать HTTP-аутентификацию, но мне нужна пользовательская форма входа, а не окно.

Есть идеи?

благодаря

Solutions Collecting From Web of "Защищенный паролем каталог и файлы в PHP"

Думаю, немного поздно ответить. В любом случае, это может помочь другим людям.

Чтобы защитить файлы от прямых загрузок, вы должны использовать комбинацию PHP + .htaccess.

Допустим, что ./downloads/ – это папка, в которой хранятся файлы, которые вы хотите загрузить. Во-первых, вы установили .htaccess в эту папку.

.htaccess в ./downloads/:

deny from all 

Это защитит папку для всех, кроме скриптов, которые выполняются на стороне сервера.

Вот пример скрипта PHP, который вы можете написать в корневом каталоге ./

index.php in ./:

 <?php if(!empty($_GET["filename"])) { //Here is the path to the folder containing files to download $my_download_folder = "./downloads/"; //Preparing headers header("Content-type: application/force-download"); //You can use more headers : //header("Content-Length: ".filesize($my_download_folder . $_GET["filename"])); //header("Content-Disposition: attachment; filename=".basename($my_download_folder . $_GET["filename"])); //You can check if the file does exist //if (!file_exists($my_download_folder . $_GET["filename"])) //exit(); //Reading file will trigger download on the browser side readfile($my_download_folder . $_GET["filename"]); } ?> <html> <form action="" method="GET"> <input type="text" name="filename" id="filename" /> <input type="submit" value="Download It !" /> </form> </html> 

Этот скрипт можно использовать как есть. Но будь осторожен. На самом деле существует серьезная уязвимость. С помощью этой формы вы можете загрузить любой файл сервера (включая файл config.php, который содержит доступ к вашей базе данных). Чтобы устранить эту уязвимость, вы можете использовать идентификаторы:

 if ($_GET["id"] == 1) $filename = "toto.pdf" if ($_GET["id"] == 2) $filename = "fish.png" 

Это хороший пример защиты файлов от прямой загрузки, но не от загрузки PHP.

Вот очень простое решение, использующее htpasswd (быстро и просто и работает).

 $ cd /path/to/password_protected_dir $ vi .htaccess 

Затем в файле .htaccess вам нужно будет добавить следующее:

 AuthUserFile /path/to/.htpasswd AuthGroupFile /dev/null AuthName "My Private Directory" AuthType Basic <Limit GET POST> require valid-user </Limit> 

Затем вы создадите файл .htpasswd, который вы только что включили в файл .htaccess, как показано выше. Вы можете сделать это так:

 $ htpasswd -c .htpasswd user_name 

На этом этапе вам будет предложено ввести пароль.

Конечно, это всего лишь один способ достижения этого.

Главный ответ – это, безусловно, способ защитить других людей от непосредственного просмотра каталога, но есть лучший способ исправить уязвимость загрузки PHP:

 if (isset($_GET['filename']) && basename($_GET['filename']) == $_GET['filename']) { // the author's code $my_download_folder = "./downloads/"; header("Content-type: application/force-download"); filename=".basename($my_download_folder . $_GET["filename"])); readfile($my_download_folder . $_GET["filename"]); } else { // shoot back an error if the file that user wants to download is not permitted } 

Поэтому просто оберните его PHP-код с помощью этого оператора if / else, чтобы другие пользователи не изучали ваш сервер.