Как стать автором
Обновить

Комментарии 33

Спасибо за статью. Сталкивался с такой проблемой.
Спасибо за объяснения.
И не поспоришь. Все правильно.
С такой проблемой не сталкивался, но за статью спасибо. Будем знать.
Сталкивался с подобным, но пошли более простым путем. Сделали симлинк на нужную директорию.
Симлинк — это костыль для неграмотно написанной программы. Если бы разработчик использовал стандартные функции, то вам не пришлось бы делать симлинки.
Тема и обсосана хостинг-провайдерами, которые дают в эту директиву так же /tmp (к сессиям не относится).
Ответственные хостинг-провайдеры также tmp директорию делают для каждого сайта отдельно.
Это очень правильный подход, тогда и tmp сидит под квотами пользователя, и сессии можно туда же пихать.
Я считаю так: на админа надейся, но сам не плошай. В том смысле, что грамотная настройка сервера — это задача админа, которая ни в коей мере не снимает с программиста ответственности за грамотность его кода.
«Грамотные» программисты делают всё по книжке «PHP для чайников». Я одну такую купил года 3 назад — до сих пор волосы шевелятся, если вспоминаю тамошние примеры.

Основная суть поста — что неправильно работают с файлами.
Чайникам тут, как раз, проще :)
С загрузкой файлов на сервер я сталкиваюсь очень редко, поэтому код загрузки файлов всегда копировал из примера[^] на php.net или из своего старого кода, который копировал из примера на php.net :)
в сорсах проскакивало и while feof :)
Хорошая статья.
Сам видел copy у товарищей. Так что будте бдительны и не делайте ошибок!
Учтем-учтем =)
Спасибо
Познавательно. Действительно, обращался напрямую. Учту эти две функции в будущем.
предлагаете сначала переместить временный файл куда то себе, а потом проверить его на валидность? в корне не согласен с таким подходом ибо это налагет на скрипт еще ответственность за удаление файла.

Имхо гораздо лучше бы прописать в спецификации к приложению пункт о том, что ему должно быть доступна такая то директория. И если потом кто-то чего то изменит, то уж простите — там сказаны требования.

Тестов конечно никто не отменял — это ответ на вопрос вроде «А как узнать что не работает?»
Если программист не хочет брать на себя ответственность за то что он делает, то конечно трудно что-то Вам возразить. Это вопрос подхода и целей. Тогда можете считать, что моя заметка адресована к тем, кто принимает на себя ответственность за свои творения и, самое главное, хочет сделать свои программы лучше, надежнее, кроссплатформенней. Если это не про Вас, смело забейте на написанное и пишите список требований к среде. Я не в коей мере Вас не осуждаю, сколько людей, столько и мнений.
тогда Вы как программист должны отвечать за то что на сервере отключены функции для работы с залитыми файлами, отключены функции конвертирования кодировок и тд и тп — за все что можно сделать с сервером…

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

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

Вариант 1: Почему не внести /tmp в open_basedir? — Ну может быть в чем-то не секурно.
Вариант 2: Почему не задать upload_tmp_dir? внутрь папок виртуального хоста, если уж вы запираете пользователей внутри?

Вы «проклинаете» тех, кто обращается напрямую и призываете использовать стандартные функции — то есть ваша логика такая: у нас секурный хостинг, а вы там еб… сь программируйте, как хотите. Может все же как-то лицом к пользователям стоит, или нет?
Попробуйте дочитать заметку до конца, она не такая уж и большая. Там есть постскриптум, где и про логику, и про лицом к пользователю.

Собственно, использование стандартных функций для загрузки — это и есть встать лицом к пользователю. Потому что программист получает дополнительные гарантии работоспособности его программы в разных окружениях. А пользователь получает надёжную программу, которая работает везде, где её не запустить.
Извиняюсь перед Вами, честно говоря написал немного на эмоции. Заметку я до конца дочитал сразу, просто первым впечатлением было: «О! Кто-то прочитал про новые директивы и решил применить… :( „
Не думаю что стоит разводить баттл из-за этого, вижу человек вы знающий то с чем имеете дело.
Но один момент я так и не понял — почему мне нельзя дать права на временную папку, тем более что права только на чтение, тем более что права туда буду иметь только я, так как это будет внутри папок моего виртуального хостинга?
Права дать можно. Если Ваша разработка будет работать на сервере под Вашим контролем, то у Вас полная свобода действий. Чего нельзя сказать если речь идёт о разработке, которая будет работать неизвестно где (например о библиотеке, или просто продукте, который предназначен для широкого круга пользователей). В этом случае хрен его знает, как будет настроен сервер. Не используя прямой доступ, Вы можете гарантировать работу программы независимо от расположения директории для загрузки файлов и установки open_basedir.
какая она надежная простите ?:)

я допустим как админ просто возьму и закрою вам доступ ВЕЗДЕ на запись — и попробуйте вы написать софт который будет загружать файлы. он должен быть в разных окружениях ведь…

каждый софт требует соблюдения каких либо условий для его работы
Она надёжнее программы, написанной без учёта того, как работает PHP.

Совершенство недостижимо, но это не значит, что к нему не надо стремиться.
отоно как :), а я просто включал временную директорию в open_basedir :)
move_uploaded_file хороша тем, что убирает мусор из темповой папки
Я, обычно, при конфигурации сервера, делаю у полльзователя еще и tmp директорию (как раз для таких случаев)
Если Вы дочитали до конца (включая постскриптум), то должны понимать, что речь идёт не о настройке сервера, а написании программ. Ведь только в очень малом количестве случаев программист имеет возможность влиять на настройку сервера, где работает написанная им программа.
Я то дочитал, но высказал свое мнение со стороны администратора сервера. То есть писать программы которые будут работать на большем количестве железа — конечно надо, но и от администратора требуется чтоб на его «машине» работало как можно больше программ (скриптов) не жертвуя безопасностью.
Это бесспорно, это очень хорошо, что Вы так конфигурируете сервера. Просто в контексте заметки это можно воспринять как альтернативное решение проблемы, что с моей точки зрения неверно. :-)
Только полноправные пользователи могут оставлять комментарии. Войдите, пожалуйста.