1. PHP / Говнокод #11965

    +42

    1. 01
    2. 02
    3. 03
    4. 04
    5. 05
    6. 06
    7. 07
    8. 08
    9. 09
    10. 10
    11. 11
    12. 12
    13. 13
    14. 14
    15. 15
    16. 16
    17. 17
    18. 18
    19. 19
    20. 20
    <?php 
    if (isset($_GET['file'])) {
    	$dirname = 'download';
    	$file = (string) $_GET['file'];
    	$file = $dirname . DIRECTORY_SEPARATOR . trim($file);
    	if (is_file($file)) {
    		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');
    		header('Pragma: public');
    		header('Content-Length: ' . filesize($file));
    		ob_clean();
    		flush();
    		readfile($file);
    		exit();
    	}
    }

    вопрос:
    Нужно чтобы при клике по ссылке запускалось скачивание файла, но ссылка должна быть не прямая как site.ru/download/file1.rar
    - а вот такая: site.ru/download/1/

    ответ:
    создайте файл download.php и папку download для файлов.
    использовать так: localhost/download.php?file=01.jpg

    Запостил: ahref, 20 Октября 2012

    Комментарии (8) RSS

    • ---> stackoverflow.com
      Ответить
    • > (string) $_GET['file']
      Выглядит.. глупым?
      Ответить
      • Слава богу, я боялся никто не заметит.
        Ответить
    • А что будет, если в download положить PHP скрипт какой-нибудь, выполнится или нет?
      Ответить
      • Через такой скрипт - не выполнится.

        Если обратиться к файлу напрямую через HTTP - выполнится, если директория доступна по HTTP и никак не защищена при помощи конфигурации сервера (скорее всего так и будет).

        Кроме того, данный код уязвим, поскольку нет проверки на последовательности вроде "../../../" - можно просматривать содержимое всех доступных серверу файлов.
        Ответить
        • Подобная дырка была в каком-то веб-обменнике, который позволял качать любые файлы. Я посмотрел, нашёл конфиги и выкачал и их тоже. В следующих версиях баги не было, но появились другие, не менее сочные: возможность использования обменника как прокси, сливать файлы данных обменника с пользователями-паролями.
          Умеют же люди писать.
          Ответить
    • Да ну это же просто пример элементарной качалки, чтоб поняли идею. Что не так? Ясен пень что надо подобавлять проверки, разбор ссылок, и прочие ингридиенты по вкусу, не будут же в ответе на вопрос за тебя готовый код писать.
      Ответить
    • а еще строчки 16 и 17 перепутаны
      Ответить

    Добавить комментарий