Хабр Курсы для всех
РЕКЛАМА
Практикум, Хекслет, SkyPro, авторские курсы — собрали всех и попросили скидки. Осталось выбрать!
Бред здесь не в сохранении файла — это необходимость из-за safe mode и open base dir
Warning: getimagesize(): open_basedir restriction in effect. File(/tmp/phpncFYlY) is not within the allowed path(s):
это бред какой-то, сначала сохранять файл, а потом проводить его валидацию, и удалять в случаи неуспеха
Не вижу проблемы в том, что у приложения есть своя временная папка или в том чтобы удалить файл, если он не прошел проверку.
Warning: tempnam(): open_basedir restriction in effect. File(/tmp) is not within the allowed path(s):
Вообще, по большому счёту, никакого смысла в open_basedir нет. Это костыль, как и safe mode.
Тем не менее, проблем безопасности типа RCE у них прилично так меньше, поскольку исполняемый скрипт недоступен через веб и указан в конфиге сервера приложений, а не как с PHP, любой файл с подходящей маской имени и находящийся внутри дерева документов является исполняемым скриптом.
Однако, а что такого священного в системных ресурсах? Куда важнее защитить данные, а не системные директории.
можно подменить любые чужие временные файлы
То, что подход, который вы предлагаете для «не создавания дыры в безопасности» не работает на небезопасном сервере, а на безопасном он просто не нужен.
/tmp — системная папка специально для временных файлов, в чём проблема с доступом к ней, если она специально задумана так, чтобы доступ был?
Откуда рекомендации? На php.net ничего такого нет. Я как раз пытаюсь показать, что подобные рекомендации лишены смысла, а то и вредны.
Эта функция проверяет, является ли файл filename загруженным на сервер (переданным по протоколу HTTP POST). Если файл действительно загружен на сервер, он будет перемещён в место, указанное в аргументе destination.
Такая проверка особенно важна в том случае, если существует шанс того, что какие-либо действия, производимые над загруженным файлом, могут открыть его содержимое пользователю или даже другим пользователям системы.
Если бы мы проверили до перемещения (да, доступ к /tmp должен быть разрешён, и я не понимаю, зачем его запрещать), даже при падении проверки файл был бы удалён.
По окончанию работы скрипта, в случае, если принятый файл не был переименован или перемещен, он будет автоматически удален из временной папки.
«можно всем»
Это по поводу вообще проверки — наш ли это файл загружен. Вы скажете, что есть is_uploaded_file
Возможно, вы удивитесь, но загружаемый файл удаляется
www.php.net/manual/ru/features.file-upload.post-method.php
По окончанию работы скрипта, в случае, если принятый файл не был переименован или перемещен, он будет автоматически удален из временной папки.
Ну это ваше личное видение.
Перечитайте, пожалуста, то, на что отвечали. ОБ ЭТОМ Я И ГОВОРЮ. Повторю: если я переместил файл (как вы предлагаете), а потом упала проверка, до удаления дело не дойдёт — я переместил его, и в лучшем случае он там останется лежать бесполезным мусором, а в худшем — будет ситуация как в статье. Поэтому нельзя пользоваться этим советом, совет — вредный.
Если бы я проверял файл там, куда его мне положили во временной директории, и проверка упала бы, то файл был бы автоматически удалён PHP после падения скрипта
Вы просто подгоняете ситуацию конкретно под этот пост. А мы говорим о совершенном разных вещах.
Это если будет кому его еще удалять (живой GC), ведь так?
Здрасте, я вроде бы пишу в комментарияк конкретно к этому посту. Не уходите в оффтопик ;)
Да. Надо понимать, что он выживает чаще, чем скрипт. Упавший GC в случае с mod_php примерно равносилен упавшему процессу вебсервера, в котором выполняется интерпретатор.
php_admin_value open_basedir /var/www/sites/site.ru
php_admin_value upload_tmp_dir /var/www/sites/site.ru/upload
если /tmp не прописан в open_basedir
В никсах также, если папка не входит в open_basedir то ни временные файлы ни сессии php сохранять в нее не будет.
php_admin_value open_basedir /var/www/sites/
session_start();
echo $_SESSION['ddas'];
var_dump($_SESSION);
$_SESSION['ddas']=1;
var_dump(session_save_path());
file_put_contents('/tmp/1.txt','sdfds');
1array(1) { [«ddas»]=> int(1) } string(13) "/var/lib/php5"
Warning: file_put_contents(): open_basedir restriction in effect. File(/tmp/1.txt) is not within the allowed path(s): (/var/www/sites/)
php_admin_value open_basedir /var/www/sites/ обрабатывается? Попытка открыть файл вне этой директории заканчивается неудачей? Хотя возможно, в 5.5 версии изменили это поведение и ваш пример действительно работает.exec, можно затем заблокировать выполнение, получив tainted-переменную. $info = getimagesize('temp/'.$filename.'.'.$ext);
$tmp_ext = str_replace('image/', '', $info['mime']);
if ($ext != $tmp_ext) {
...
}
<Files ~ "\..+$">
Deny from all
</Files>
php_flag engine 0
RemoveHandler .phtml .php .php3 .php4 .php5 .php6 .phps .cgi .exe .pl .asp .aspx .shtml .shtm .fcgi .fpl .jsp .htm .html .wml
AddType application/x-httpd-php-source .phtml .php .php3 .php4 .php5 .php6 .phps .cgi .exe .pl .asp .aspx .shtml .shtm .fcgi .fpl .jsp .htm .html .wml
AddType "text/html" .php .cgi .pl .fcgi .fpl .phtml .shtml .php2 .php3 .php4 .php5 .asp .jsp
этим способом ложили
Опасный getimagesize() или Zip Bomb для PHP