Im создает простую личную страницу со ссылками на некоторые файлы для загрузки. Я сделал это с простым управлением сеансом, но у меня есть проблема: если кто-то нажимает на файл-url, он может загрузить файл без аутентификации. Так что я могу сделать, чтобы этого избежать? Я могу сделать HTTP-аутентификацию, но мне нужна пользовательская форма входа, а не окно.
Есть идеи?
благодаря
Думаю, немного поздно ответить. В любом случае, это может помочь другим людям.
Чтобы защитить файлы от прямых загрузок, вы должны использовать комбинацию PHP + .htaccess.
Допустим, что ./downloads/ – это папка, в которой хранятся файлы, которые вы хотите загрузить. Во-первых, вы установили .htaccess в эту папку.
deny from all
Это защитит папку для всех, кроме скриптов, которые выполняются на стороне сервера.
Вот пример скрипта PHP, который вы можете написать в корневом каталоге ./
<?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, чтобы другие пользователи не изучали ваш сервер.