Правила форума Гаранты форума
Размещение рекламы AMX-X компилятор

Здравствуйте, гость Вход | Регистрация

Наши новости:

14-дек
24-апр
10-апр
11-апр

> Правила форума

Раздел для общения на любые темы, для которых не нашлось места в остальных разделах. Если Вашу тему можно отнести по смыслу к другому разделу, лучше создайте её там, иначе Вас накажут.

В данном форуме немного понижены требования к Общим правилам форума, а именно:
1. Информативность темы
2. Отходить от первоначального смысла темы

!
В разделе запрещено создавать темы связанные с раскруткой игровых серверов

Помощь в php

Статус пользователя Archangel236
сообщение 3.2.2017, 16:21
Сообщение #1


Стаж: 16 лет
Город: Белая Церковь

Сообщений: 444
Благодарностей: 184
Полезность: 550

Столкнулся с проблемой кто знает подскажите куда копать. Есть форма отправки файла методом пост. К примеру прикрепляю в него файл echo.txt он заливается в временную директорию с именем файла /var/www/data/mod-tmp/phpx0iuiN и отправляется по email с последующим удалением.
Файл отсылается, но во вложении на почту приходит файл phpx0iuiN (без разрешения файла .txt)

Необходимо на уровне отправки взять файл с временной директории
Код
$this->request->files['file']['tmp_name']
и сменить ему имя на то что было изначально, оно есть в переменной
Код
$this->request->files['file']['name']

В данный момент в переменных

Код
    [files] => Array
        (
            [file] => Array
                (
                    [name] => echo.txt
                    [tmp_name] => /var/www/data/mod-tmp/phpx0iuiN
                )

        )


Пробовал
Код
rename()
но он переименовывает файл в /var/www/data/mod-tmp/echo.txt и теряет зависимость для отправки. Указал вручную "/var/www/data/mod-tmp/".
Код
$this->request->files['file']['name']
но файл после уже не удаляет. Может есть вариант попроще
Перейти в начало страницы         Просмотр профиля    Отправить личное сообщение
   Цитировать сообщение
Статус пользователя esterio
сообщение 3.2.2017, 17:09
Сообщение #2
Стаж: 13 лет
Город: Украина

Сообщений: 266
Благодарностей: 215
Полезность: 627

Как файл отправляете? phpMailer?


Ми будемо вбивати росіян у будь-якій точці світу до повної перемоги України
Перейти в начало страницы         Просмотр профиля    Отправить личное сообщение
   + Цитировать сообщение
MpAimPro
сообщение 3.2.2017, 17:44
Сообщение #3
Стаж: 9 лет
Город: Минск

Сообщений: 827
Благодарностей: 205
Полезность: 253

Меценат Меценат

По сути тут всё просто.
Разбиваешь свой файл на 2 переменных(Название и разрешение)
Далее просто при отправке уже подставляешь всё в правильной последовательности, и у тебя название файла остаётся исходным

Получение разрешение файла делается таким образом
Код
$type_atach = substr($_FILES['atach']['name'], strrpos($_FILES['atach']['name'], '.')+1);


Отредактировал: MpAimPro, - 3.2.2017, 17:48
Перейти в начало страницы         Просмотр профиля    Отправить личное сообщение
   + Цитировать сообщение
Статус пользователя Archangel236
сообщение 3.2.2017, 18:09
Сообщение #4


Стаж: 16 лет
Город: Белая Церковь

Сообщений: 444
Благодарностей: 184
Полезность: 550

Цитата(esterio @ 3.2.2017, 17:09) *
Как файл отправляете? phpMailer?

да $mail->addAttachment($this->request->files['file']['tmp_name']);


MpAimPro, Доеду домой попробую
Перейти в начало страницы         Просмотр профиля    Отправить личное сообщение
   + Цитировать сообщение
Статус пользователя esterio
сообщение 3.2.2017, 18:25
Сообщение #5
Стаж: 13 лет
Город: Украина

Сообщений: 266
Благодарностей: 215
Полезность: 627

MpAimPro, плохой мовет
1. Костыльный метод с расширением. Читаем документацию http://php.net/manual/ru/function.pathinfo.php
2. Получаем возможность использовать пхп иньекцию таким аот способом

Archangel236, гуглиться 10 секунд
http://stackoverflow.com/questions/1176415...pmailer-and-php


Ми будемо вбивати росіян у будь-якій точці світу до повної перемоги України
Перейти в начало страницы         Просмотр профиля    Отправить личное сообщение
   + Цитировать сообщение
Статус пользователя Mysterion
сообщение 3.2.2017, 18:25
Сообщение #6


Стаж: 9 лет 7 месяцев

Сообщений: 5
Благодарностей: 9
Полезность: 0

Archangel236, там же нативно можно с нужным названием файл отправить:
Код
$mail->addAttachment($this->request->files['file']['tmp_name'], $this->request->files['file']['name']);


Скрипты и программы на заказ, интересные - бесплатно.
Перейти в начало страницы         Просмотр профиля    Отправить личное сообщение
   + Цитировать сообщение
Статус пользователя esterio
сообщение 3.2.2017, 18:38
Сообщение #7
Стаж: 13 лет
Город: Украина

Сообщений: 266
Благодарностей: 215
Полезность: 627

мовет -> совет
аот -> вот

Отредактировал: esterio, - 3.2.2017, 18:38


Ми будемо вбивати росіян у будь-якій точці світу до повної перемоги України
Перейти в начало страницы         Просмотр профиля    Отправить личное сообщение
   + Цитировать сообщение
Статус пользователя Archangel236
сообщение 3.2.2017, 19:01
Сообщение #8


Стаж: 16 лет
Город: Белая Церковь

Сообщений: 444
Благодарностей: 184
Полезность: 550

Mysterion, Так изначально и было) вот только не пашит ))
Перейти в начало страницы         Просмотр профиля    Отправить личное сообщение
   + Цитировать сообщение
MpAimPro
сообщение 3.2.2017, 21:43
Сообщение #9
Стаж: 9 лет
Город: Минск

Сообщений: 827
Благодарностей: 205
Полезность: 253

Меценат Меценат

esterio, иньекцию в расширение реально только перед этим делается сверка файлового расширение с допустимыми в пых скрипте. И иньекцию уже не пройдёт
Код
if (strtolower(preg_match('/[.](gif)|(png)|(jpg)|(bmp)$/', $_FILES['img_hed']['name']))) {/*тут скрипт*/}else{ echo "Не верное разрешение"; }


Отредактировал: MpAimPro, - 3.2.2017, 21:45
Перейти в начало страницы         Просмотр профиля    Отправить личное сообщение
   + Цитировать сообщение
Статус пользователя Archangel236
сообщение 3.2.2017, 22:09
Сообщение #10


Стаж: 16 лет
Город: Белая Церковь

Сообщений: 444
Благодарностей: 184
Полезность: 550

У меня по mine type проверка, если это не картинка или архив все в садик
Перейти в начало страницы         Просмотр профиля    Отправить личное сообщение
   + Цитировать сообщение
umprex
сообщение 3.2.2017, 23:26
Сообщение #11


Иконка группы

Стаж: 16 лет
Город: Киев

Сообщений: 2909
Благодарностей: 4781
Полезность: 2197

MpAimPro, зачем ты переводишь в нижний регистр булев ответ?
Archangel236, mime типа бывает недостаточно.

P.S. '/\.[png|bmp|jpg|jpeg|gif]$/i'


Перейти в начало страницы         Просмотр профиля    Отправить личное сообщение
   + Цитировать сообщение
Статус пользователя esterio
сообщение 4.2.2017, 0:39
Сообщение #12
Стаж: 13 лет
Город: Украина

Сообщений: 266
Благодарностей: 215
Полезность: 627

MpAimPro,
https://habrahabr.ru/post/148999/
читаем и учимся почему такая проверка плохая. и еще неграмотное правило regex


Ми будемо вбивати росіян у будь-якій точці світу до повної перемоги України
Перейти в начало страницы         Просмотр профиля    Отправить личное сообщение
   + Цитировать сообщение
Статус пользователя esterio
сообщение 4.2.2017, 0:59
Сообщение #13
Стаж: 13 лет
Город: Украина

Сообщений: 266
Благодарностей: 215
Полезность: 627

umprex,
Цитата
P.S. '/\.(png|bmp|jpg|jpeg|gif)$/i'


Ми будемо вбивати росіян у будь-якій точці світу до повної перемоги України
Перейти в начало страницы         Просмотр профиля    Отправить личное сообщение
Поблагодарили 1 раз
   + Цитировать сообщение
Статус пользователя esterio
сообщение 4.2.2017, 1:13
Сообщение #14
Стаж: 13 лет
Город: Украина

Сообщений: 266
Благодарностей: 215
Полезность: 627

если речь идет о загрузке картинок то
припустим у нас есть
Код
$fileName = $_FILES['img_hed']['name'];
$filePath = $_FILES['img_hed']['tmp_name'];

1. далее первый етап getimagesize
Код
if (getimagesize($filePath) !== false) {
    echo 'OK';
}

2. проверяем расширение
Код
if (in_array(pathinfo($filePath, PATHINFO_EXTENSION), array('jpg', 'gif', 'png'), true) {
    echo 'OK';
}

3. проверяем mime тип
Код
if (in_array(mime_content_type($filePath), 'image/jpeg', 'image/gif', 'image/png'), true) {
    echo 'OK';
}

4. пережимаем изображение http://php.net/manual/en/book.imagick.php
5. меняем имя файла на случайный хэш сохраняя в базе оригинальное имя и генерированое
5. выносим на поддомен (например pics.example.com) где nginx настроен на отдачу файлов без подключено ПХП

Такие манипуляции позволяют избежать все самые популярные виды инъекций. Но на все 100% не защитят


Ми будемо вбивати росіян у будь-якій точці світу до повної перемоги України
Перейти в начало страницы         Просмотр профиля    Отправить личное сообщение
   + Цитировать сообщение
Статус пользователя jtiq
сообщение 4.2.2017, 9:39
Сообщение #15


Иконка группы

Стаж: 18 лет

Сообщений: 1717
Благодарностей: 767
Полезность: 979

Меценат Меценат

umprex, там не булев ответ, а кол-во найденных под этот regex запрос
Перейти в начало страницы         Просмотр профиля    Отправить личное сообщение
   + Цитировать сообщение
MpAimPro
сообщение 4.2.2017, 10:15
Сообщение #16
Стаж: 9 лет
Город: Минск

Сообщений: 827
Благодарностей: 205
Полезность: 253

Меценат Меценат

umprex, Разве булев? Мы просто отсекаем лишнию и получаем тип. далее уже идёт по сравнению с указаннами.
PS Конечно гляну тк писал по памяти, да и 35+ часов без сна дают о себе знать, сча спать идти нужно голова не варит.

Отредактировал: MpAimPro, - 4.2.2017, 10:36
Перейти в начало страницы         Просмотр профиля    Отправить личное сообщение
   + Цитировать сообщение
umprex
сообщение 4.2.2017, 12:50
Сообщение #17


Иконка группы

Стаж: 16 лет
Город: Киев

Сообщений: 2909
Благодарностей: 4781
Полезность: 2197

jtiq, "кол-во" в диапазоне от 0 до 1, потому это больше похоже на булев тип. Реальное количество возвращает preg_match_all(), правда не до конца уверен.


Перейти в начало страницы         Просмотр профиля    Отправить личное сообщение
   + Цитировать сообщение
Статус пользователя onotole
сообщение 4.2.2017, 16:40
Сообщение #18


Иконка группы

Стаж: 13 лет

Сообщений: 1572
Благодарностей: 1119
Полезность: 1550

Меценат Меценат

preg_match() returns 1 if the pattern matches given subject, 0 if it does not, or FALSE if an error occurred.
http://php.net/manual/en/function.preg-match.php

Самый лучший набор действий при закачке изображений:
1. Проверять mime тип
2. Проверять картинку на картинку, например c помощью getimagesize
3. Пересохранять картинку. Например напрямую через GD или Imagic, либо при помощи Imagine
4. Не читать папки с картинками, а хранить имена картинок в базе. При чем, сохранять физический файл с рандомным именем и без расширения. А расширение и имя хранить в базе. Отдавать картинку через imagepng или ему подобных функций (Опять же можно использовать Imagine)
5. Сохранять картинки в папке, в которой нет прав на выполнение из PHP
Перейти в начало страницы         Просмотр профиля    Отправить личное сообщение
Поблагодарили 1 раз
   + Цитировать сообщение
  Ответить в данную темуНачать новую тему
 
0 пользователей и 1 гостей читают эту тему: