Остановите людей, загружающих злонамеренные файлы PHP через формы

Вы можете использовать flatMap для поиска списка в списке. Я лично считаю, что List не должно никогда быть null, вместо этого это должен быть пустой список. Если это гарантия, то код может быть таким:

boolean hasError = message.getItems().stream()
    .flatMap(t -> t.getErrors().stream())
    .findAny()
    .isPresent();
return (hasError ? "success" : "failure");

В противном случае код становится немного длиннее:

boolean hasError = Optional.ofNullable(message.getItems()).orElse(List.of()).stream()
    .flatMap(t -> Optional.ofNullable(t.getErrors()).orElse(List.of()).stream())
    .findAny()
    .isPresent();
return (hasError ? "success" : "failure");

Обратите внимание, что я мог бы также использовать .count() > 0 вместо из .findAny().isPresent(). Но недостаток первого состоит в том, что он повторяется по всем ошибкам, в то время как последний замыкает накоротко, если обнаружена какая-либо ошибка.

29
задан Alix Axel 19 March 2012 в 19:37
поделиться

8 ответов

Im, действительно взволнованный по поводу людей способность загрузить злонамеренные php файлы, большую угрозу безопасности!

Верхушка айсберга!

я также должен знать, что люди изменяют расширения php файлов, пытающихся обойти это средство защиты.

Обычно изменение расширений будет мешать PHP интерпретировать те файлы как сценарии. Но это не единственная проблема. Существует больше вещей, чем †˜... php’, который может повредить серверную сторону; †˜. htaccess’ и файлы с X наборами битов являются очевидными, но ни в коем случае всем, о чем необходимо волноваться. Даже игнорируя материал серверной стороны, существует огромная клиентская проблема.

, Например, если кто-то может загрузить †˜. файл html’, они могут включать < сценарий> отмечает на нем, который угоняет сессию стороннего пользователя, и удаляет все их загруженные файлы или изменяет их пароль или что-то. Это - классические перекрестные сценарии сайта (XSS) нападение.

Плюс, благодаря ‘content-sniffing’ поведениям некоторых браузеров (прежде всего, IE), файл, который загружается как †˜. gif’ может на самом деле содержать злонамеренный HTML, такой как это. Если IE видит болтунов как (но не ограниченный) †˜< HTML> ’ около запуска файла это может проигнорировать подаваемый ‘Content-Type’ и отобразиться как HTML, приводящий к XSS.

Плюс, возможно обработать файл, который является и действительное изображение, которое примет Ваш синтаксический анализатор изображения, и содержит встроенный HTML. Существуют различные возможные результаты в зависимости от точной версии браузера пользователя, и точный формат файла изображения (JPEGs в особенности имеют очень переменный набор возможных форматов заголовка). Существуют смягчение прибытие в IE8, но это бесполезно на данный момент, и необходимо задаться вопросом, почему они не могут просто сниффинг содержания выполнения остановки, Вы идиоты MS вместо того, чтобы обременять нас shonky нестандартными расширениями HTTP-заголовков, которые должны были Просто Работать во-первых.

я попадаю в напыщенную речь снова. Я остановлюсь. Тактика для обслуживания предоставленных пользователями изображений надежно:

1: Никогда не храните файл в файловой системе своего сервера с помощью имени файла, взятого от ввода данных пользователем. Это предотвращает ошибки, а также нападения: различные файловые системы имеют различные правила о том, какие символы допустимы, где в имени файла, и это намного более трудно, чем Вы могли бы думать к ‘sanitise’ именам файлов.

Даже при взятии чего-то очень строгого как “only ASCII letters” все еще необходимо волноваться о слишком длинных, также коротких, и зарезервированных именах: попытайтесь сохранить файл со столь же безвредным именем как “com.txt” на Windows Server и наблюдать, что Ваше приложение понижается. Думайте, что Вы знаете все странные недостатки путей каждой файловой системы, в которой могло бы работать Ваше приложение? Уверенный?

Вместо этого детали файла хранилища (такие как имя и тип среды) в базе данных и использовании первичный ключ как имя в Вашем хранилище файлов (например, “74293.dat”). Вам тогда нужен способ служить им с различными очевидными именами файлов, такими как сценарий загрузчика, выкладывающий файл, сценарий загрузчика, делающий веб-сервер внутреннее перенаправление или перезапись URL.

2: Будьте очень, очень тщательное использование ZipArchive. Были пересекающийся уязвимости в extractTo того же вида, которые влияли на самые наивные находящиеся на пути экстракторы ZIP. Кроме того, Вы кладете себя открытый для нападения от бомбы ZIP . Лучше всего для предотвращения любой опасности плохих имен файлов, путем продвижения посредством каждой записи файла в архив (например, использования zip_read/zip_entry_ * ) и проверки его деталей прежде вручную распаковать его поток в файл с известным - хорошее имя и флаги режима, которые Вы генерировали без справки архива. Проигнорируйте пути к папкам в ZIP.

3: Если можно загрузить файл изображения, и сохраняют его, отступают снова , особенно если Вы обрабатываете его в некотором роде промежуточный (например, для изменения размеры/миниатюры его, или добавьте водяной знак), можно быть довольно уверены, что результаты будут чистыми. Теоретически могло бы быть возможно сделать изображение, которое предназначалось для конкретного компрессора изображения, так, чтобы, когда это было сжато, результаты были также похожи на HTML, но это походит на очень трудное нападение мне.

4: Если можно сойти с рук обслуживание всех изображений как загрузки (т.е. использование ‘Content-расположения: attachment’ в сценарии загрузчика), Вы, вероятно, в безопасности. Но это могло бы быть слишком большим неудобства для пользователей. Это может работать в тандеме с (3), тем не менее, обслуживание меньшие, обработанные встроенные изображения и имение в наличии исходных изображений более высокого качества как загрузка только.

5: Если необходимо вручить неизменные встроенные изображения, можно удалить риск перекрестных сценариев сайта путем обслуживания их от другого домена. Например, используйте ‘images.example.com’ для недоверяемых изображений и ‘www.example.com’ для основного сайта, который содержит всю логику. Удостоверьтесь, что cookie ограничены только корректным виртуальным хостом, и что виртуальные хосты настраиваются так, они не могут ответить ни на чем кроме их имен собственных (см. также: нападения повторного переплетения DNS). Это - то, что делают многие сервисы веб-почты.

, Таким образом, отправленный пользователями мультимедийный контент является проблемой.

В сводке сводки, AAAARRRRRRRGGGGHHH.

комментарий ре ETA:

наверху Вы упомянули о 'файлах с X наборами битов', что Вы подразумеваете под этим?

я не могу говорить ZipArchive.extractTo(), поскольку я не протестировал его, но много экстракторов при выяснении вывести файлы из архива воссоздадут [часть из] флаги режима файла Unix, связанные с каждым файлом (если архив был создан на Unix и поэтому на самом деле имеет флаги режима). Это может вызвать Вас проблемы полномочий, если, скажем, владелец читал, разрешение отсутствует. Но это может также быть проблема безопасности, если Ваш сервер является поддерживающим CGI: X биты могут позволить файлу быть интерпретированным как сценарий и переданным любому интерпретатору сценария, перечисленному в hashbang на первой строке.

я думал, что .htaccess должен был быть в основном корневом каталоге, этот не имеет место?

Зависит, как Apache настраивается, в особенности директива AllowOverride. Это характерно для хостов общего назначения AllowOverride на любом каталоге.

, что произошло бы, если бы кто-то все еще загрузил файл как../var/www/wr_dir/evil.php?

я ожидал бы продвижение †˜.. ’ был бы отброшен, это - то, что сделали другие инструменты, которые перенесли ту же уязвимость.

, Но я все еще не доверял бы extractTo() против враждебного входа, существует слишком много странных небольших вещей имени файла/дерева каталогов, которые могут пойти wrong —  especially, если Вы ожидаете когда-нибудь работать на серверах Windows. zip_read() дает Вам намного больший контроль над процессом разархивирования и следовательно взломщика намного меньше.

65
ответ дан 28 November 2019 в 00:44
поделиться

Сначала необходимо запретить каждый файл, что doesn’t имеют надлежащее расширение файла изображения. И после этого, Вы могли использовать getimagesize функция , чтобы проверить, являются ли файлы регулярными файлами изображений.

, Но кроме того необходимо знать, что некоторые форматы изображения позволяют комментарии и другую метаинформацию. Это могло использоваться для вредоносного кода, такого как JavaScript, который некоторые браузеры выполнят при определенных обстоятельствах (см. Опасный MIME осуществлять сниффинг в Internet Explorer).

15
ответ дан 28 November 2019 в 00:44
поделиться

Вы могли бы также хотеть рассмотреть выполнение обнаружения типа пантомимы со следующей библиотекой:

http://ca.php.net/manual/en/ref.fileinfo.php

2
ответ дан 28 November 2019 в 00:44
поделиться

Я не вижу риск в том, что переименовал php файлы в Вашем DB... Пока Вы не оцениваете их как файлы PHP (или вообще, в этом отношении), они не могут причинить слишком много вреда, и так как нет никакого .php расширения, php механизм не коснется их.

я предполагаю, что Вы могли также искать файлы <?php...

Также : примите худшее о файлах, загруженных на Вашу машину. Переименованный в папку, в которую Вы сохраняете их "вирусы" и рассматриваете его соответственно. Не обнародуйте его, не давайте полномочия запуска файла (особенно php пользователь), и т.д.

2
ответ дан 28 November 2019 в 00:44
поделиться

Вы не должны, вероятно, полагаться только на расширение файла, тогда. Попытайтесь передать каждый файл через библиотеку изображений для проверки этого действительно изображение, также.

9
ответ дан 28 November 2019 в 00:44
поделиться

Теперь Вы полагаетесь на свое пространство на жестком диске для извлечения. Можно проверить fileheaders для определения, какие файлы они. там, вероятно, библиотеки для этого.

offtopic: не это лучше, чтобы позволить пользователю выбрать несколько изображений вместо того, чтобы загрузить zip-файл. Лучше для людей, которые не знают то, что zip (да они существуют)

1
ответ дан 28 November 2019 в 00:44
поделиться

Если Вы устанавливаете php, чтобы только проанализировать файлы, заканчивающиеся .php, то можно просто переименовать файл от somename.php до somename.php.jpeg, и Вы в безопасности.

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

1
ответ дан 28 November 2019 в 00:44
поделиться

Лично, я добавил бы, что что-то к Apache конфигурируется, чтобы удостовериться, что он служил файлам PHP в качестве текста от местоположения, на которое загружаются файлы, таким образом, Вы в безопасности, и можете позволить другим типам файлов быть загруженными в будущем.

1
ответ дан 28 November 2019 в 00:44
поделиться
Другие вопросы по тегам:

Похожие вопросы: