2010-05-11 6 views
1

У меня есть скрипт, который позволяет пользователям «сохранить как» PDF, это сценарий -PHP создать файл огромные ошибки на моем сервере feof() Fread()

<?php 
header("Content-Type: application/octet-stream"); 

$file = $_GET["file"] .".pdf"; 
header("Content-Disposition: attachment; filename=" . urlencode($file)); 
header("Content-Type: application/force-download"); 
header("Content-Type: application/octet-stream"); 
header("Content-Type: application/download"); 
header("Content-Description: File Transfer");    
header("Content-Length: " . filesize($file)); 
flush(); // this doesn't really matter. 
$fp = fopen($file, "r"); 
while (!feof($fp)) 
{ 
    echo fread($fp, 65536); 
    flush(); // this is essential for large downloads 
} 
fclose($fp); 
?> 

Журнал ошибок создается и получает более чем концерт через несколько дней ошибки, которые я получаю являются-

[10-May-2010 12:38:50] PHP Warning: filesize() [<a href='function.filesize'>function.filesize</a>]: stat failed for BYJ-Timetable.pdf in /home/byj/public_html/pdf_server.php on line 10 
[10-May-2010 12:38:50] PHP Warning: Cannot modify header information - headers already sent by (output started at /home/byj/public_html/pdf_server.php:10) in /home/byj/public_html/pdf_server.php on line 10 
[10-May-2010 12:38:50] PHP Warning: fopen(BYJ-Timetable.pdf) [<a href='function.fopen'>function.fopen</a>]: failed to open stream: No such file or directory in /home/byj/public_html/pdf_server.php on line 12 
[10-May-2010 12:38:50] PHP Warning: feof(): supplied argument is not a valid stream resource in /home/byj/public_html/pdf_server.php on line 13 
[10-May-2010 12:38:50] PHP Warning: fread(): supplied argument is not a valid stream resource in /home/byj/public_html/pdf_server.php on line 15 
[10-May-2010 12:38:50] PHP Warning: feof(): supplied argument is not a valid stream resource in /home/byj/public_html/pdf_server.php on line 13 
[10-May-2010 12:38:50] PHP Warning: fread(): supplied argument is not a valid stream resource in /home/byj/public_html/pdf_server.php on line 15 

линии 13 и 15 просто продолжать дальше и дальше ... Я немного новичка с PHP так что любой помощь велика. Спасибо ребята Nik

+0

как насчет некоторого форматирования, этот код трудно читать –

ответ

4

То, что происходит:

  • Ваш файл не может быть найден, поэтому функция filesize errorred из
  • Потому что это ошибочный, оно производится вывод.
  • После того как вы выход, вы не можете отправить больше заголовков
  • Поскольку вы отправляете больше заголовков, вы получаете больше ошибок

Потому что ваш файл не был найден, ваш цикл в то время выдаст ошибку навсегда, потому что вы пытаетесь прочитать из файла, который не существует.

ТАКЖЕ: Файл имеет один тип контента, а не 4. Вам нужно выбрать один из типов контента и использовать его, вы не можете передать их все.

И, наконец: Ваш скрипт ужасно небезопасный. Если кто-то прошел ?file=/home/apache/secret_db_passwords.txt, тогда у них сразу будет доступ к вашим материалам.

Редактировать: PHP имеет функцию с именем readfile, которая предназначена для обработки именно того, что вы пытаетесь сделать. Вам не нужно, чтобы цикл while выполнялся через посылку файла. Просто сделайте readfile($file); и веб-сервер будет обрабатывать все это дерьмо для вас

+0

+1 для защиты! – Anthony

+0

Отлично ... но sh # t сейчас меня немного волнует, поскольку я использовал этот скрипт на многочисленных веб-сайтах, которые имеют конфиденциальную информацию о них ... о, дорогая! Я понимаю, что вы говорите, я просто не знаю, как реализовать исправления? Я вырезал и вставлял этот сценарий, так как все мои навыки позволяют, когда дело доходит до php = \ – Nik

+0

Ну, вы должны установить имя файла как нечто похожее (например, все буквы/цифры). Таким образом, вы можете удалить все остальные символы. Вы также можете попробовать удалить все '/' или что-то в этом роде, но я не уверен в простой взломе аддона, чтобы исправить эту проблему. Но, как правило, вы НИКОГДА не должны позволять пользователю указывать параметры, которые непосредственно вставляются в таблицу или используются для доступа к файлу (без должной дезинфекции) –

1

Пара вещей:

  1. Вы можете задать только заголовок один раз, насколько я знаю, поэтому установку вашего Content-Type четыре раза бессмысленно.

  2. Это может помочь, если вы установите тип содержимого в формате PDF mime, в этом случае я бы пошел с application/pdf.

  3. Force Download не является типом контента, насколько я знаю. Браузер загрузится, если вы установите Content-Disposition на attachment, который у вас уже есть.

  4. И, наконец, если нет PDF-версии файла (что похоже, что нет), почему вы пытаетесь передать его? Вероятно, вы хотите установить переменную $file в фактический файл и сделать другую переменную, например $filename, для установки имени файла PDF, которое выводится пользователю.

+0

Технически вы можете отправить более одного заголовка. Однако вам нужно сделать 'header (« Header », false)' 'false '' сообщает ему добавить. (Но он никогда не используется для заголовка Content-Type, так как это не имеет смысла) –

+0

Я был полублефом, но я рад, что был прав в этом случае. Спасибо за головы. – Anthony

1
[10-May-2010 12:38:50] PHP Warning: fopen(BYJ-Timetable.pdf) [<a href='function.fopen'>function.fopen</a>]: failed to open stream: No such file or directory in /home/byj/public_html/pdf_server.php on line 12 

Это должно сказать вам, что вы должны знать: fopen и filesize оба должны быть переданы имя и путь к, файл должен быть открыт. В этом случае вы просто передаете имя файла, нет пути, поэтому он пытается найти его в текущем каталоге, в котором запущен скрипт. В этом случае /home.byj/public_html/

Чтобы исправить это, вам необходимо применить относительный или абсолютный путь к файлу PDF, чтобы открыть эти функции, а не только имя самого файла PDF.