|
|
|
| Прочитал наhttp://habrahabr.ru/blogs/php/44610/
Безопасная загрузка изображений на сервер.
Возникло желание в скрипт, скаченный на этом форуме, внести защиту
Помогите, пожалуйста, объединить 2 файла в один
<html>
<head>
<title>Результат загрузки файла</title>
</head>
<body>
<?php
if($_FILES["filename"]["size"] > 1024*3*1024)
{
echo ("Размер файла превышает три мегабайта");
exit;
}
// Проверяем загружен ли файл
if(is_uploaded_file($_FILES["filename"]["tmp_name"]))
{
// Если файл загружен успешно, перемещаем его
// из временной директории в конечную
move_uploaded_file($_FILES["filename"]["tmp_name"], $_SERVER['DOCUMENT_ROOT'].'/upload/'.$_FILES["filename"]["name"]);
} else {
echo("Ошибка загрузки файла");
}
echo $_SERVER['DOCUMENT_ROOT'].'/upload/'.$_FILES["logo"]["name"];
var_dump($_FILES);
echo "temp file: ",$_FILES["filename"]["tmp_name"], "<br>";
echo "new file: ", $_SERVER['DOCUMENT_ROOT'].'/upload/'.$_FILES["filename"]["name"];
?>
</body>
</html>
|
<?php
$blacklist = array(".php", ".phtml", ".php3", ".php4");
foreach ($blacklist as $item) {
if(preg_match("/$item\$/i", $_FILES['userfile']['name'])) {
echo "We do not allow uploading PHP files\n";
exit;
}
}
$uploaddir = 'uploads/';
$uploadfile = $uploaddir . basename($_FILES['userfile']['name']);
if (move_uploaded_file($_FILES['userfile']['tmp_name'], $uploadfile)) {
echo "File is valid, and was successfully uploaded.\n";
} else {
echo "File uploading failed.\n";
}
?>
|
| |
|
|
|
|
|
|
|
для: Василий
(01.01.2012 в 09:24)
| | [поправлено модератором] | |
|
|
|
|
|
|
|
для: Василий
(01.01.2012 в 09:24)
| | Да защита в этом скрипте "очень хорошая", php не грузим, а js к примеру - запросто...
Очень безопасно, тем паче что изображения не перерисовываются, а тупо забрасываются.
Если после установки этого php "шедевра" вас ломанут, вы особо не удивляйтесь!
P.S. Эту тему правильней переименовать - Опасная загрузка изображений | |
|
|
|
|
|
|
|
для: Tamplier
(03.01.2012 в 13:39)
| | "Опасная загрузка изображений" - это в первом коде? Если да, то что добавить в этот код из второго кода? | |
|
|
|
|
|
|
|
для: Василий
(03.01.2012 в 15:21)
| | >Если да, то что добавить в этот код из второго кода?
Ни чего ....
Вернее во втором коде только проверка расширения файла, но этого крайне недостаточно.
Я Вам дал ссылку, смотрите ещё раз внимательно. перечитайте статью ещё раз на хабре, обратите внимание на функцию getimagesize(); | |
|
|
|
|
|
|
|
для: Slo_Nik
(03.01.2012 в 15:35)
| |
<?php
/**
* Function of uploaded of a file
* Функция загрузки файла (аплоадер)
* @param int $max_file_size максимальный размер файла в килобайтах
* @param array $valid_extensions массив допустимых расширений
* @param string $upload_dir директория загрузки
* @return array сообщение о ходе выполнения
*
* @author IT studio IRBIS-team (www.irbis-team.com)
* @copyright © 2009 IRBIS-team
*/
function uploadHandle($max_file_size = 100, $valid_extensions = array(), $upload_dir = '.')
{
$error = null;
$info = null;
$max_file_size *= 1024;
if ($_FILES['userfile']['error'] === UPLOAD_ERR_OK)
{
// проверяем расширение файла
$file_extension = pathinfo($_FILES['userfile']['name'], PATHINFO_EXTENSION);
if (in_array($file_extension, $valid_extensions))
{
// проверяем размер файла
if ($_FILES['userfile']['size'] < $max_file_size)
{
$destination = $upload_dir .'/' . $_FILES['userfile']['name'];
if (move_uploaded_file($_FILES['userfile']['tmp_name'], $destination))
$info = 'Файл успешно загружен';
else
$error = 'Не удалось загрузить файл';
}
else
$error = 'Размер файла больше допустимого';
}
else
$error = 'У файла недопустимое расширение';
}
else
{
// массив ошибок
$error_values = array(
UPLOAD_ERR_INI_SIZE => 'Размер файла больше разрешенного директивой upload_max_filesize в php.ini',
UPLOAD_ERR_FORM_SIZE => 'Размер файла превышает указанное значение в MAX_FILE_SIZE',
UPLOAD_ERR_PARTIAL => 'Файл был загружен только частично',
UPLOAD_ERR_NO_FILE => 'Не был выбран файл для загрузки',
UPLOAD_ERR_NO_TMP_DIR => 'Не найдена папка для временных файлов',
UPLOAD_ERR_CANT_WRITE => 'Ошибка записи файла на диск'
);
$error_code = $_FILES['userfile']['error'];
if (!empty($error_values[$error_code]))
$error = $error_values[$error_code];
else
$error = 'Случилось что-то непонятное';
}
return array('info' => $info, 'error' => $error);
}
/////////////////////////////////////////////////////////////////////
$extensions = array('jpg', 'jpeg', 'png', 'gif');
$upload_dir = 'images';
// Запускаем функцию
if(!empty($_POST['upload_submit']))
{
$message = uploadHandle(200, $extensions, $upload_dir);
// Выводим сообщение
echo $message['error'] ? $message['error'] : $message['info'];
}
?>
<form action="" method="post" enctype="multipart/form-data">
<input type="file" name="userfile" />
<input type="submit" value="Закачать" name="upload_submit" />
</form>
|
Warning: move_uploaded_file(images/yutex.png) [function.move-uploaded-file]: failed to open stream: Permission denied in..... on line 33
Warning: move_uploaded_file() [function.move-uploaded-file]: Unable to move '/tmp/phpuOvTOz' to 'images/yutex.png' in .....on line 33
Не удалось загрузить файл | |
|
|
|
|
|
|
|
для: Василий
(03.01.2012 в 15:40)
| | А о чём говорит ошибка Вы потрудились узнать?
Эта ошибка возникла из-за того, что Вы не думая скопировали скрипт..... Так он у Вас не заработает.
Где Вы тестируете скрипт, на локальном или на реальном хостинге? | |
|
|
|
|
|
|
|
для: Slo_Nik
(03.01.2012 в 15:47)
| | на хостинге | |
|
|
|
|
|
|
|
для: Василий
(03.01.2012 в 15:51)
| | так о чём же говорит ошибка? ))) | |
|
|
|
|
|
|
|
для: Slo_Nik
(03.01.2012 в 15:52)
| | Если все прошло без ошибок, то перемещаем файл из временной папки в нужную нам. Для этого используем
move_uploaded_file($filename, $destination), где $filename - путь к файлу, который надо переместить, а $destination - путь, куда мы хотим сохранить наш файл вместе с именем.
Вопрос.
1) НАдо ли создавать временную папку? | |
|
|
|
|
|
|
|
для: Василий
(03.01.2012 в 15:54)
| | временную папку создавать не надо, вот выставить права доступа к той директории, в которую Вы загружаете файлы, надо. Установить можно через ftp клиент
Об этом Вам и было сказано в ошибке | |
|
|
|
|
|
|
|
для: Василий
(03.01.2012 в 15:54)
| | $destination = $upload_dir .'/' . $_FILES['userfile']['name'];
Файлы должны записываться в эту папку img/logo
Значит будет вот так?
$destination = $ img/logo .'/' . $_FILES['userfile']['name']; | |
|
|
|
|
|
|
|
для: Василий
(03.01.2012 в 15:57)
| | а Вы попробуйте, и получите скорей всего очередную ошибку....
$destination ="img/logo/' . $_FILES['userfile']['name']; вот так будет правильней | |
|
|
|
|
|
|
|
для: Slo_Nik
(03.01.2012 в 16:02)
| | так дает ошибку
Parse error: syntax error, unexpected T_ENCAPSED_AND_WHITESPACE, expecting T_STRING or T_VARIABLE or T_NUM_STRING in.... line 31 | |
|
|
|
|
|
|
|
для: Василий
(03.01.2012 в 16:05)
| | как так?
если Вы о том, что писал я, то там проблема в кавычках, исправьте и синтактическая ошибка уйдёт | |
|
|
|
|
|
|
|
для: Slo_Nik
(03.01.2012 в 16:06)
| |
$destination ="img/logo/' . $_FILES['userfile']['name']";
|
А как кавычки исправить? | |
|
|
|
|
|
|
|
для: Василий
(03.01.2012 в 16:10)
| | >А как кавычки исправить?
Вы отлично шутите, я оценил ))))
Так же исправить, как и любой символ в редакторе при опечатке )))) | |
|
|
|
|
|
|
|
для: Slo_Nik
(03.01.2012 в 16:12)
| | Вопрос задам по-другому.
Вы предложили:
$destination ="img/logo/' . $_FILES['userfile']['name'];
Но одной " не хватает. Убрал ее - ошибка. Добавляю в конец - ошибка | |
|
|
|
|
|
|
|
для: Василий
(03.01.2012 в 16:15)
| | [поправлено модератором] | |
|
|
|
|
|
|
|
для: Slo_Nik
(03.01.2012 в 16:18)
| | файл закачал.
Спасибо.
Успехов | |
|
|
|