Эта тема на forum.dklab.ru


berkut: загрузка файла
Я уже наверно всех замучил, но не получается вроде достаточно простая вещь. Пытаюсь загрузить файл, но ничего как-всегда не получаеться.
<form enctype="multipart/form-data" action="index.php" method="post">
<input name="MAX_FILE_SIZE" type="hidden" value="1000000">
<input name="userfile" type="file">
<input type="submit" value="Send" name="su">
</form>
<?php
if(isset($_POST['su']))
{
$userfile=$_FILE['userfile']['tmp_name'];
$userfile_name=$_FILE['userfile']['name'];
$userfile_size=$_FILE['userfile']['size'];
$userfile_type=$_FILE['userfile']['type'];
$userfile_error=$_FILE['userfile']['error'];
В итоге все переменные пустые:
Notice: Undefined variable: _FILE in z:\home\test\www\index.php on line 10 и т.д.
7.3.:
berkut:
$_FILES
Дмитрий Котеров:
berkut:
На будущее: в случае затруднений не спешите спрашивать, вызовите сначала phpinfo() и посмотрите, что за переменные у Вас вообще есть в скрипте.
berkut:
У меня возник ещё один вопрос. Вот если сделать так:
$userfile=$_FILES['userfile']['tmp_name'];
$userfile_name=$_FILES['userfile']['name'];
copy ($userfile, 'upload/$userfile_name');
То как в этом случае можно явно из формы указать tmp_name(что-бы копировался не файл во временной директории, а какой-нибудь файл на сервере)? Если использовать не $_FILES['userfile']['tmp_name'], а $userfile с register_globals on то всё понятно.
В книге я вычитал, что с $_FILES['userfile']['tmp_name'] нужно всегда использовать не copy, а move_uploaded_file,
но сдесь http://seclists.org/bugtraq/2000/Sep//0237.html сказано, что $_FILES['tmp_name'] никак не подменить
Евгений Галашин:
явно из формы указать tmp_name
Этого сделать нельзя будет никогда по причинам безопасности. Это даст возможность писать что угодно кому угодно и куда угодно. Если Вам нужно именно это, копайте в сторону HTTP PUT.

В книге я вычитал, что с $_FILES['userfile']['tmp_name'] нужно всегда использовать не copy, а move_uploaded_file,
но сдесь http://seclists.org/bugtraq/2000/Sep//0237.html сказано, что $_FILES['tmp_name'] никак не подменить
чем move от copy отличается?
Дмитрий Котеров:
То как в этом случае можно явно из формы указать tmp_name(что-бы копировался не файл во временной директории, а какой-нибудь файл на сервере)?
Сделайте в форме еще одно поле (текстовое), в котором можно вводить путь назначения.
berkut:
Наверно я несовсем ясно выразился. Мне не нужно явно указывать tmp_name. Мне просто интересно, насколько безопасно использовать $_FILES['userfile']['tmp_name']; и copy. Можно-ли злонамеренно указать скрипту tmp_name? В bugtraq написано, что при использовании глобальных массивов типа $HTTP_ POST_FILES и $_FILES использовать copy() безопасно, а в книжке написано обратное, т.е. даже элемент массива $_FILES['userfile']['tmp_name'] можно подменить, и ввиду этого нужно использовать не copy а move_uploaded_file
Евгений Галашин:
насколько я знаю, move_uploaded_file проверяет, где находиться копируемый файл. и если файл находиться во временной директории сервера, то он его копирует, в противном случае нет. А copy копирует файл отовсюду, откуда только сможет.
Дмитрий Котеров:
даже элемент массива $_FILES['userfile']['tmp_name'] можно подменить
Там полный путь, или только имя файла? Если только имя, тогда, наверное, опдменить нельзя — в смысле, не удастся туда вставить всякие там ../../../etc/passwd
berkut:
там /tmp\php26B.tmp
Антон Макаренко:
offtopic.
sorry
Дмитрий Котеров:
там /tmp\php26B.tmp
Плохо. Надо тогда basename от этого брать, что ли. И вручную проверять спецсимволы - всякие там пробелы, слэши, ".." и т.д.

Эта тема на forum.dklab.ru