Как фильтровать json файл на laravel 8

Обновлено: 07.07.2024

В этой статье я хочу рассказать как в небольшой проект на Laravel можно быстро добавить удобный инструмент для работы с изображениями - Spatie Media Library. Этот пакет хорошо известен и содержит подробную документацию. Коротко про преимущества, medialibrary позволяет:

  1. Связать изображение или группу изображений с вашей моделью в проекте.
  2. Настроить преобразование изображений, размещая иx по коллекциям.
  3. Производить манипуляции с изображениями, такими как сжатие и конвертация в другие форматы.
  4. Настраивать пользовательскую структуру каталогов.

В статье будет пошагово описано как можно использовать medialibrary в небольшом проекте. Проект будет иметь только одну модель Post, и будет добавлен простенький CRUD для полноценной демонстрации работы. Если вы планируете использовать уже существующую модель, пропустите шаги 1 - 6.

Шаг 1. Создание тестового приложения.

Шаг 2. Настройка соединения с базой данных

Дальше следует создать базу данных и в файле .env настроить соединение .

Шаг 3. Создание модели Post

В нашем тестовом проекте будет только одна модель Post, чтобы сгенерировать модель вместе с файлом миграции и контроллером ресурсов, используем команду.

Эта команда создаст файлы модели Product.php, контроллер ProductController.php и файл миграции в папке database/migrations/ *.create_product_table.php

Шаг 4. Редактирование файла миграции

В файл миграции добавим два поля title и content, для заголовка и содержимого статьи

Шаг 5. Создание маршрутов для модели Post

Далее необходимо подготовить маршруты для создание views c формой добавления постов. Так как контроллер у нас готов и содержит все необходимые методы, мы можем зарегистрировать маршрут:

Шаг 6. Создание CRUD и VIEWS

Хоть проект и тестовый, но для полноценной демонстрации возможностей пакета medialibrary придется создать простенький CRUD. Особо не заостряя внимания на стилях, создам несколько максимально упрощенных видов. Код проекта можно посмотреть на github.

В папке resources/views создаём папку posts и файлы для создания views

Расположение файлов должно соответствовать изображению ниже:

post

Я собрал небольшую html страничку, подключил bottstrap cdn и добавил формы. Полный листинг можно посмотреть на github. В результате должна получиться форма показанная на рисунке ниже:

p3

p2

Шаг 7. Установка и настройка medialibrary

Чтобы установить пакет medialibrary в вашем приложении выполните в консоле следующую команду.

Дождитесь пока пакет будет скачан.

ready

Осталось только опубликовать и запустить миграцию:

migrate

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

Шаг 8. Подготовка модели для работы с Media Library

Для связи нашей модели с medialibrary нужно в файл app\Post.php добавить связи c пакетом, имплементировать интерфейс и добавить трейт. В результате должно получиться так :

Зеленым подсвечены строки, который необходимо добавить к модели. Массив $fillable понадобиться для тестирования CRUD ниже.

Шаг 9. Связывание файлов с моделью

Для связывания изображений с моделью нужно внести изменения в PostController. В пункте 6 была создана форма с добавлением поста, следовательно нужно в контроллер добавить обработчик.

В функции store() отработает сохранение данных и будет произведена проверка на наличие у записи прикреплённого медиафайла из коллекции "images", если нет, то в таблицу "media" будет сделана запись.

Существуют несколько методов API для добавления медиафайлов в зависимости от потребностей проекта:

addMediaFromRequest('image') - метод выбирает из текущего запроса изображение и добавляет в коллекцию images

addMediaFromRequest('image') - метод выбирает из текущего запроса нескольких файлов и добавляет их в коллекцию

addMediaFromUrl(string $url) - метод позволяет загрузить изображение из стороннего источника

Шаг 10. Изменение размеров изображений

Пакет medialibrary содержит прекрасный инструмент conversion для создания коллекций миниатюр разного формата. Для того, что бы его использовать, нужно в модель Post добавить функцию преобразования изображений. Для примера добавим две коллекции для миниатюр thumb и для адаптивного вывода изображения full-size .

После чего подключить связь моделью Media

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

listing

Шаг 11. Вывод изображения

Путь к изображению можно получить, обратившись к определённой коллекции, в нашем случае коллекция называется "images" :

Если указать путь во views, изображение не отобразиться потому, что по умолчанию Laravel хранит все файлы в защищённом хранилище storage/app/public, и что бы сделать их публичными, нужно создать символьную ссылку на хранилище командой:

Заключительная часть. Тестирование и выводы.

В итоге был развернут проект создана модель Post и подключен пакет Spatie Media Library. Осталось протестировать.

Сначала добавим новый пост, для этого нужно заполнить форму по пути /posts/create.

add post
result

На рисунках выше показан результат. Создание материала прошло успешно. В базе данных были созданы две записи:

В таблице post

post

В таблице media

media post

Как видно из записей, изображения привязаны через полиморфную связь, что очень удобно: нет нужды добавлять дополнительные поля к модели Post. Большим плюсом будет генерация коллекций изображений, где при конвертировании можно оптимизировать, изменить размер и даже изменить цветность.

При создании API-интерфейсов с использованием Laravel вам часто нужно преобразовывать свои модели и отношения в массивы или JSON. Eloquent включает удобные методы для выполнения этих преобразований, а также для управления тем, какие атрибуты включаются в сериализованное представление ваших моделей.

Чтобы получить еще более надежный способ обработки JSON-сериализации модели Eloquent и коллекции, ознакомьтесь с документацией на Ресурсы API Eloquent.

Сериализация моделей и коллекций

Сериализация в массивы

Чтобы преобразовать модель и ее загруженные отношения в массив, вы должны использовать метод toArray . Этот метод является рекурсивным, поэтому все атрибуты и все отношения (включая отношения отношений) будут преобразованы в массивы:

Метод attributesToArray используется для преобразования атрибутов модели в массив, но не его отношений:

Вы также можете преобразовать целые коллекции моделей в массивы, вызвав метод toArray экземпляра коллекции:

Сериализация в JSON

Чтобы преобразовать модель в JSON, вы должны использовать метод toJson . Как и toArray , метод toJson является рекурсивным, поэтому все атрибуты и отношения будут преобразованы в JSON. Вы также можете указать любые параметры кодировки JSON, которые поддерживаются PHP:

В качестве альтернативы вы можете преобразовать модель или коллекцию в строку, которая автоматически вызовет метод toJson модели или коллекции:

Поскольку модели и коллекции преобразуются в JSON при преобразовании в строку, вы можете возвращать объекты Eloquent непосредственно из маршрутов или контроллеров вашего приложения. Laravel автоматически сериализует ваши модели и коллекции Eloquent в JSON, когда они возвращаются из маршрутов или контроллеров:

Отношения

Когда модель Eloquent преобразуется в JSON, ее загруженные отношения автоматически включаются в качестве атрибутов в объект JSON. Кроме того, хотя методы-отношения Eloquent определены с использованием имен методов в «верблюжьей нотации», атрибут JSON отношения будет в «змеиной нотации».

Скрытие атрибутов из JSON

По желанию можно исключить атрибуты, такие как пароли, содержащиеся в массиве модели или представлении JSON. Для этого добавьте в модель свойство $hidden . Атрибуты, перечисленные в массиве свойств $hidden , не будут включены в сериализованное представление модели:

Чтобы скрыть отношения, добавьте имя метода-отношения к свойству $hidden модели Eloquent.

В качестве альтернативы вы можете использовать свойство visible для определения «разрешенного списка» атрибутов, которые должны быть включены в массив модели и представление JSON. Все атрибуты, отсутствующие в массиве $visible , будут скрыты при преобразовании модели в массив или JSON:

Временное изменение видимости атрибута

По желанию можно сделать некоторые обычно скрытые атрибуты видимыми на конкретном экземпляре модели, для этого используйте метод makeVisible . Метод makeVisible возвращает экземпляр модели:

Аналогично, если вы хотите скрыть некоторые атрибуты, которые обычно видны, вы можете использовать метод makeHidden :

Добавление значений в JSON

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

После создания аксессора добавьте имя атрибута к свойству appends модели. Обратите внимание, что на имена атрибутов обычно ссылаются в «змеиной нотации», даже если аксессор определяется с помощью «верблюжьей нотации»:

После того, как атрибут был добавлен в список appends , он будет включен как в массив модели, так и в представления JSON. Атрибуты в массиве appends также будут учитывать настройки visible и hidden , заданные в модели.

Добавление во время запроса

Во время выполнения скрипта вы можете указать экземпляру модели добавить дополнительные атрибуты с помощью метода append . Или вы можете использовать метод setAppends , чтобы переопределить весь массив добавленных свойств для конкретного экземпляра модели:

Сериализация Даты

Настройка формата даты по умолчанию

Вы можете настроить формат сериализации по умолчанию для всех дат вашей модели, переопределив метод serializeDate вашей модели. Этот метод не влияет на форматирование дат для их сохранения в базе данных:

Настройка формата даты для каждого атрибута

Вы можете настроить формат сериализации отдельных атрибутов даты, указав формат даты при объявлении типизации модели:

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

Введение

Laravel – это элегантный, выразительный и гибкий PHP-фреймворк с упором на чистый код и скорость. Он позиционирует себя как «PHP-фреймворк для веб-мастеров». Это бесплатный PHP-фреймворк с открытым исходным кодом, созданный Тейлором Отвелом на основе архитектурной модели Model View Controller (MVC).

Создание веб-приложения с нуля может быть сложной задачей, особенно если вы новичок. Простое веб-приложение содержит различные маленькие и большие компоненты, и вам, возможно, надоест создавать эти компоненты каждый раз, когда вы разрабатываете приложение. Это скучный и повторяющийся процесс, и нет никакого смысла изобретать велосипед. Вот тогда вам на помощь и приходит фреймворк Laravel.

Фреймворк Laravel предоставляет различные PHP-библиотеки и вспомогательные функции. Он обеспечивает общие функции и логику, чтобы упростить и ускорить разработку, а также помочь вам сосредоточиться на более важных вещах.

Чтобы вам было легче изучить Laravel, я написал это руководство специально для неопытной аудитории. Так вам будет проще следовать этому руководству и изучать Laravel.

Что вы должны знать перед использованием этого руководства по Laravel?

  • HTML/CSS (Естественно).
  • Понимание базового PHP.
  • Владение PHP на среднем уровне – это не обязательно, но если у вас есть время, изучите некоторые рядовые вещи: ООП в PHP, абстракцию и т. д.
  • Базовое понимание фреймворка MVC.
  • Усидчивость – несмотря на то, что изучать Laravel довольно легко, спустя какое-то время вам всё же придется испытать собственное терпение. По крайней мере, у меня были некоторые проблемы из-за того, что я знал PHP, но совсем не разбирался в фреймворках. Когда я изучал фреймворк или успешно завершал проекты, я всё равно путался с базовыми вещами, которые лежат в основе фреймворка MVC. Но я не сдавался.
  • Увлечение – да ладно вам, ведь веб-разработка – это весело! По крайней мере, когда используешь Laravel. Лучше всего получать наслаждение от своего познавательного путешествия.

Установка и настройка

Требования для установки Laravel 8

Перед установкой Laravel на вашу локальную платформу (Localhost) вам необходимо установить следующие программы:

  • Веб-сервер – Apache или nginx
  • >= PHP 7.3
  • Некоторые расширения PHP, которые можно установить заранее:
  1. BCMath
  2. Ctype
  3. Fileinfo
  4. JSON
  5. Mbstring
  6. OpenSSL
  7. PDO
  8. Tokenizer
  9. XML
  • MySQL (или другие системы управления базой данных, вы даже можете использовать SQLite).
  • Composer
  • IDE (интегрированная среда разработки) будет очень полезна для разработки на Laravel. Я рекомендую VS Code или Atom. И то, и другое можно использовать совершенно бесплатно.

Пошаговая установка Laravel на локальном хосте:

Шаги для пользователей Mac:

  1. Убедитесь, что все компоненты установлены.
  2. Установите Composer, используя следующую команду (если у вас уже установлен и настроен Composer, пропускайте этот шаг).
  • Перейти в нужную папку;
  • Выполнить команду laravel new projectname.

Шаги для пользователей Windows:

  1. Скачайте Composer и установите его.
  2. После успешного завершения установки необходимо проверить, установлен ли он глобально. Откройте командную строку и введите команду «Composer», как показано ниже.
  • Перейти в нужную папку;
  • Зажать клавишу Shift + щелкнуть правой кнопкой мыши и выбрать пункт «Открыть командную строку здесь»;
  • Выполнить команду laravel new projectname/

В нашем примере выполняем:

Руководство по созданию простого CRUD-приложения для составления списка дел на Laravel

Лучший способ изучить программирование – практиковаться. Поэтому здесь мы будем изучать основы Laravel, разрабатывая простое веб-приложение, которое будет выполнять перечисленные ниже функции. В рамках этого руководства по Laravel:

  • Вы сможете зарегистрироваться и войти в веб-приложение;
  • Вы cможете добавлять задачи в свой список дел;
  • Вы cможете редактировать или удалять эти задачи;
  • Ваш список виден только вам, поэтому он использует аутентификацию через электронную почту и пароль.

Изучение структуры папок

  • Модели (Models) представляют сущности в базе данных, помогают запрашивать базу данных и возвращать данные.
  • Представления (View) – это страницы, которые будут отображаться при доступе к приложению. Элементы представлений используются для пользовательского интерфейса приложения.
  • Контроллеры (Controllers) обрабатывают запросы пользователей, получают необходимые данные от моделей и передают их представлениям. Контроллеры действуют как посредники между компонентами модели и представления для обработки бизнес-логики, а также входящего запроса.

После того как вы установили Composer и создали свое первое веб-приложение на основе Laravel, вы могли заметить папку приложения с разными файлами и папками внутри. Я знаю, если вы новичок, у вас может возникнуть много вопросов о том, для чего нужны эти папки и т. д. и т. п.

Давайте разберём некоторые из них

Пошаговое создание вашего первого приложения на Laravel

Создайте ваш проект

Если вы не создали свой проект в разделе установки, создайте его сейчас, выполнив следующую команду:

Настройте базу данных

Для нашего приложения нам понадобится база данных, поэтому лучше всего создать её в первую очередь. Laravel поддерживает четыре СУБД:

В этом примере мы будем пользоваться SQLite, так как её проще настроить и использовать. И вам не придется ничего устанавливать – нужно будет всего лишь создать один пустой файл. Другие СУБД должны быть установлены в вашей системе, только потом их можно настраивать соответствующим образом. Laravel позволяет файлу config/database.php настраивать базу данных, но лучше не хранить в нем учетные данные. Вместо этого вы можете использовать файл .env , в котором можно хранить различные типы учетных и других данных.

В корневой папке Laravel по умолчанию находится файл .env .

В этом файле вы найдете код, похожий на следующий:

Замените все шесть строк, приведенные выше на одну строку, указанную ниже, то есть измените значение db_connection на sqlite и удалите остальные строки db, как здесь:

Теперь в папке базы данных создайте файл database.sqlite (это файл базы данных с расширением .sqlite)

Создайте аутентификацию

Laravel также предоставляет «скелет» для аутентификации. Это означает, что всё, связанное с аутентификацией: вход пользователя, регистрация, потеря пароля, двухфакторная аутентификация и т.д. будет создаваться заранее, если вам это необходимо. Это называется Laravel Jetstream .

Есть два способа добавить Jetstream в ваше новое Laravel-приложение. Если вы еще не создали проект, добавьте флажок

для новой команды Laravel:

Так как выше мы уже создали проект, вы можете установить его с помощью установочного пакета. Сначала установите пакет Jetstream , используя следующую команду:

Jetstream в Laravel поддерживает два стека

Liveware или Inerta. Поскольку мы хотим, чтобы этот проект был простым, давайте воспользуемся Livewire и установим Jetstream с помощью следующей команды:

Затем запустите «npm install && npm run dev» , чтобы создать свои объекты.

На данном этапе мы закончили с настройкой и можем приступать непосредственно к созданию приложения.

Миграции

Первый шаг в разработке любого приложения – это создание базы данных. Laravel предлагает отличный способ разработки таблиц и схемы базы данных, а также даёт возможность легко переносить их в разные системы, которые называются «Миграции».

Миграции используются, чтобы создавать, изменять, а также делиться схемой базы данных приложения. Они используются с конструктором схем Laravel, чтобы упростить создание схемы базы данных. В создании миграций для вашей базы данных есть много преимуществ. Вы сможете легко перестроить структуру своей базы данных, используя файлы миграции в производственной и любой другой системе.

Ничего страшного, если это объяснение показалось вам непонятным. Поверьте, скоро у вас всё получится. Просто читайте дальше.

Выполните следующую команду:

Вы найдёте только что созданную миграцию в папке /database/migrations.

Теперь давайте добавим еще два столбца в таблицу задач, отредактировав только что созданный файл миграции.

В новом столбце с именем «description» будет храниться описание задачи, а в столбце с именем «user_id» будет храниться идентификатор пользователя, создавшего задачу. Мы добавили «-> unsigned () -> index ()» после user_if, потому что это внешний ключ из таблицы пользователей.

Теперь мы закончили с созданием схемы базы данных. Чтобы использовать эту схему для создания таблиц в базе данных, выполните следующую команду. Команда migrate обновит изменения, внесенные в схему, в базе данных.

Модели -Eloquent

Eloquent – это ORM (система объектно-реляционного отображения) для Laravel, которая позволяет свободно применять active-record для работы с базой данных. Каждая таблица базы данных может иметь соответствующую модель Eloquent. Модель Eloquent представляет объекты базы данных. Она может использоваться для запроса данных, а также для вставки и обновления данных в таблице. Итак, давайте с помощью команды make: model создадим модель для нашей таблицы задач.

Эта команда создаст модель задачи в папке приложения, как показано ниже.

Отношение «один-ко-многим»

Отношения используются для соединения таблиц. Eloquent даёт возможность связать свои модели через отношения Eloquent. Отношение «один ко многим» означает, что одна модель владеет несколькими объемами другой модели. В нашем примере: у одного пользователя может быть много задач, поэтому между таблицей пользователей и таблицей задач существует связь «один ко многим». Отношения Eloquent очень легко определить и использовать. И преимущество заключается в том, что вам вообще не нужно запускать запросы. Eloquent свяжет модели между собой, поэтому вам придется использовать только функции.

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

Модель задачи (файл task.php находится в app/task.php):

Модель пользователя (файл user.php находится в app/user.php):

Команда Tinker в Artisan (необязательно)

В Laravel существует интерфейс командной строки, известный как Artisan. Artisan содержит различные команды, и среди них – Tinker, которую мы собираемся обсудить. Tinker позволяет вам взаимодействовать со всем вашим Laravel- приложением через окно консоли без необходимости доступа к веб-интерфейсу. Основным преимуществом Tinker является то, что вы можете тестировать отношения, отлаживать данные и получать доступ к Eloquent ORM, задачам, тестам, событиям и т. д. Поэтому мы также будем использовать команду Tinker в нашем руководстве по Laravel. Допустим, вы зарегистрировались в приложении и создали две задачи. Теперь вы проверяете эти задачи прямо в окне консоли, как показано ниже:

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

Контроллеры

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

Маршрутизация

Маршрутизация означает принятие запроса и его перенаправление к соответствующей функции. Нашему приложению понадобится пять маршрутов, которые будут выполнять следующие действия:

  • Авторизоваться;
  • Зарегистрироваться;
  • Показать список всех наших задач;
  • Добавить новые задачи;
  • Удалить существующие задачи.

Laravel Jetstream добавляет вход и регистрацию, поэтому теперь нам нужно позаботиться только о трех маршрутах.

Laravel предоставляет различные файлы маршрутов внутри папки / routes для разных случаев использования. Например, настройка маршрутизации для API будет находиться в файле « /routes/api.php », а настройка маршрутизации для нашего веб-приложения будет находиться в «/routes/web.php».

Теперь давайте отредактируем файл web.php . Ниже вы увидите отредактированную версию этого файла. Внесите соответствующие изменения:

Здесь мы внесли два изменения:

  1. Мы сгруппировали все маршруты, чтобы можно было применять auth: sanctum и проверенное промежуточное программное обеспечение ко всем маршрутам, тем самым давая доступ к этим страницам только проверенным пользователям, вошедшим в систему.
  2. Мы изменили маршрут для панели управления, который теперь будет передавать запрос в функцию index в TaskController . Также мы создали маршруты для других действий.

Представления – шаблоны Blade

  1. blade.php (панель управления покажет список задач);
  2. blade.php (форма, которая позволит вам добавить новую задачу);
  3. blade.php (форма, которая позволит вам отредактировать любую задачу).

Laravel включает в себя довольно удобный макет, который содержит панель навигации под названием app.blade.php , расположенную в папке Views / layouts . С помощью механизма Blade в Laravel вы cможете разделить свои страницы на подсекции, а также использовать раздел панели навигации по умолчанию в новых представлениях.

Теперь в папке / resources / views создайте файлы add.blade.php и edit.blade.php с разметкой, приведенной ниже.

В файле dashboard.blade.php также замените весь код на тот, который приведен выше. Представления мы отредактируем позже, после определения функций нашего контроллера с помощью привязки модели к маршруту.

Привязка модели к маршруту (Route-Model Binding)

В Laravel есть множество удивительных функций, которые делают веб-разработку простой, чистой и менее трудоемкой. Одна из наиболее заметных функций подобного рода – привязка модели к маршруту (Route-Model Binding). Это механизм для внедрения экземпляра модели в ваши маршруты. Это значит, вы можете передавать объект модели в маршруты, а также в представления по маршрутам. Эта функция поможет вам легко получить значения объекта в представлении. Ничего страшного, если это объяснение кажется непонятным. Со временем вы все поймёте.

Теперь давайте добавим в TasksController.php функции, обрабатывающие указанные выше маршруты. Они должны выглядеть так, как показано ниже:

Как вы можете видеть, я передаю в функцию объект «Task $ task», а также объект «Request $ request» с помощью механизма привязки модели маршрута.

Редактируем представления

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

Откройте файл dashboard.blade.php и отредактируйте его следующим образом:

Механизм шаблонов Blade позволяет нам использовать PHP внутри HTML, не заключая его в «<? Php?>».

Откройте файл add.blade.php и отредактируйте его следующим образом:

Откройте файл edit.blade.php и отредактируйте его, как показано ниже:

После редактирования этого представления мы собираем все части воедино, так что теперь сможем протестировать своё приложение.

Сначала зарегистрируйтесь, затем войдите в систему, а потом проверьте, можете ли вы создать задачу, отредактировать задачу и удалить задачу.

Запускаем проект на Localhost

Чтобы запустить проект, запустите в окне терминала команду php artisan serve. Убедитесь, что вы находитесь в корне вашего приложения в терминале.

Обязательно прочтите инструкции, прежде чем копировать код с github .

Что делать с этим проектом дальше:

Существует множество вещей, которые можно добавить в этот проект, например:

  • Проверка формы:
  • Разрешение пользователю создавать несколько списков с несколькими задачами;
  • Профиль пользователя;
  • И многое другое.

Заключение

Надеюсь, что это руководство по Laravel помогло вам понять основы Laravel, а также мотивировало вас учиться дальше. Пожалуйста, поделитесь своим мнением о Laravel и об этом руководстве. А также вы можете делиться в комментариях к этой статье вашими вопросами и проблемами. Будем рады вам помочь. Спасибо.

Пожалуйста, оставьте свои отзывы по текущей теме материала. За комментарии, подписки, дизлайки, отклики, лайки низкий вам поклон!


Биб­лиоте­ка Ignition нуж­на для кас­томиза­ции сооб­щений об ошиб­ках, что полез­но во вре­мя раз­работ­ки и отладки. Ignition дос­тупна и исполь­зует­ся в Laravel «из короб­ки», а так­же встре­чает­ся в дру­гих про­ектах.

Уяз­вимость воз­можна из‑за некор­рек­тной обра­бот­ки парамет­ров POST-зап­роса. Бла­года­ря это­му зло­умыш­ленник может отпра­вить про­изволь­ные дан­ные в качес­тве аргу­мен­тов фун­кций file_get_contents и file_put_contents . Спе­циаль­но сфор­мирован­ная цепоч­ка таких зап­росов при­водит к воз­можнос­ти выпол­нить код на целевой сис­теме.

Баг обна­ружил Чарльз Фол (Charles Fol) из Ambionics Security. Уяз­вимос­ти прис­воен иден­тифика­тор CVE-2021-3129 и кри­тичес­кий ста­тус, так как для успешной экс­плу­ата­ции не нуж­на авто­риза­ция. Баг при­сутс­тву­ет в Ignition 2.5.2 и ниже.

Стенд

В качес­тве стен­да будем исполь­зовать кон­тей­нер Docker на осно­ве Debian 10.

docker run -ti --name = "laravelrce" -p8080 :80 debian /bin/bash

Ус­тановим необ­ходимые пакеты. В качес­тве веб‑сер­вера я буду исполь­зовать nginx.

apt install -y nano curl unzip nginx php-fpm php-common php-mbstring php-xmlrpc php-soap php-gd php-xml php-mysql php-cli php-zip php-curl php-pear php-dev python xxd libfcgi

За­тем нуж­но про­инстал­лировать Composer.

Че­рез него соз­дадим про­ект на осно­ве фрей­мвор­ка Laravel. Для удобс­тва помес­тим фай­лы в дирек­торию / var/ www .

cd / var/ www & & rm -rf html & & composer create- project laravel/ laravel . "v8. 4. 2" & & sed -i -E 's|"facade/ ignition": ". +?"|"facade/ ignition": "2. 5. 1"|g' composer. json & & composer update & & mv public html

Те­перь отре­дак­тиру­ем кон­фиги nginx. Вклю­чаем обра­бот­ку скрип­тов PHP и нас­тра­иваем необ­ходимый для Laravel редирект.

sed -i -E 's|index index|index index. php index|g' /etc/nginx/sites-enabled/default sed -i -E 's|try_files \ $uri. *|try_files \ $uri \ $uri/ / index. php?\ $query_string; |g' /etc/nginx/sites-enabled/default

Ме­няем нас­трой­ку демона PHP-FPM, что­бы он работал по TCP и висел на 9000-м пор­те.

Для изу­чения деталей работы Ignition нам так­же пот­ребу­ется прос­тень­кий кон­трол­лер. Добавим роут test .

/var/www/routes/web.php

Те­перь нуж­но соз­дать view (пред­став­ление) это­го роута. Для опи­сания пред­став­лений в Laravel исполь­зует­ся шаб­лониза­тор Blade.

/www/resources/views/test.blade.php

где $name — это перемен­ная, которую нуж­но передать во view .

С этим разоб­рались, оста­лось ска­чать сор­цы фрей­мвор­ка. Их мож­но взять пря­мо из Docker.

Те­перь все готово и мож­но прис­тупать к раз­бору уяз­вимос­ти.

Детали уязвимости

Для начала про­верим, вклю­чена ли Ignition. Мож­но отпра­вить зап­рос, для которо­го нет обра­бот­чика у кон­крет­ного роута. Нап­ример, неп­лохо работа­ет DELETE на index. php .

Отправка некорректного типа запроса DELETE на index.php

От­прав­ка некор­рек­тно­го типа зап­роса DELETE на index.php

Бо­лее близ­ким к нашей уяз­вимос­ти будет такой зап­рос:

Ес­ли видишь кра­сивую кар­тинку с сооб­щени­ем об ошиб­ке, как на скрин­шоте, — зна­чит, все идет по пла­ну. Помимо кас­томизи­рован­ных стра­ниц с сооб­щени­ем об ошиб­ке, Ignition поз­воля­ет соз­давать так называ­емые solutions. Это неболь­шие фраг­менты кода, они помога­ют решить проб­лемы, с которы­ми стал­кива­ются раз­работ­чики. Нап­ример, вер­немся к нашему роуту test . В шаб­лоне мы исполь­зуем перемен­ную $name , но не переда­ем ее, поэто­му Laravel вер­нет ошиб­ку.

Об­рати вни­мание на кноп­ку Make variable optional. При нажатии к сер­веру ухо­дит инте­рес­ный зап­рос.

В парамет­ре solution ука­зыва­ется класс, который нуж­но выпол­нить. Шту­ка любопыт­ная, но ука­зать про­изволь­ный класс там не получит­ся, так как Ignition тре­бует, что­бы вызыва­емый класс реали­зовы­вал интерфейс RunnableSolution .

Читайте также: