22 677 Монеток
В статье “Обзор атрибутов Laravel: что и как использовать” осуждали возможность упрощения внедрения зависимостей с помощью атрибутов. Однако ограничиваться только стандартными атрибутами Laravel не обязательно. Можно создать собственный атрибут, который будет выполнять нужную нам задачу.
Пример создания атрибута, который автоматически подтягивает значения из конфигурации, то есть быть похожим на хелпер config()
:
Для начала создадим класс MyConfig
, который реализует интерфейс Illuminate\Contracts\Container\ContextualAttribute
. Это необходимо для того, чтобы контейнер мог с ним работать.
namespace App\Attributes;
use Attribute;
use Illuminate\Contracts\Container\Container;
use Illuminate\Contracts\Container\ContextualAttribute;
#[Attribute(Attribute::TARGET_PARAMETER)]
class MyConfig implements ContextualAttribute
{
public function __construct(
public string $key,
) {}
public static function resolve(self $attribute, Container $container)
{
return $container->make('config')->get($attribute->key);
}
}
Теперь атрибут #[MyConfig]
готов. Используем его, например, для автоматической подстановки имени приложения в контроллере:
namespace App\Http\Controllers;
use App\Attributes\MyConfig;
class ExampleController extends Controller
{
public function __construct(
#[MyConfig('app.name')] protected string $appName
) {}
public function show(): string
{
return "Имя приложения: {$this->appName}";
}
}
Конечно в Laravel уже имеется атрибут Config
, но главное, что этот пример легко адаптировать под другие задачи, такие как подстановка API-ключей, флагов и т.п.
Попробуйте применить подход в своём проекте и поэкспериментировать – скорее всего, вы найдете несколько мест, где такой подход будет полезен.
22 677 Монеток
В Laravel была устранена уязвимость (CVE-2024–52301) с уровнем опасности 8.7. Позволяющая изменить среду выполнения приложения (например, переключиться с production
на development
) через строку запроса URL. Это было возможно при включённой директиве PHP register_argc_argv
. Используя специально сформированный URL, злоумышленник мог изменять настройки среды приложения и получить доступ к конфиденциальным данным, доступным только в режиме отладки.
Допустим, Laravel обрабатывает URL с параметром argv
, например:
http://example.com/?argv[]=--env&argv[]=development
Такой запрос мог бы заставить приложение работать в среде development
, если оно использует argv
для определения текущей среды.
Версия Laravel | Уязвимые версии |
---|---|
< 6.x | До 6.20.45 |
7.x | От 7.0.0 до 7.30.7 |
8.x | От 8.0.0 до 8.83.28 |
9.x | От 9.0.0 до 9.52.17 |
10.x | От 10.0.0 до 10.48.23 |
11.x | От 11.0.0 до 11.31.0 |
В новых версиях Laravel аргументы argv
больше не учитываются для выбора среды выполнения при работе через веб-сервер (Только через консоль). По этому рекомендуется обновиться или отключить директиву register_argc_argv
.
Предыдущая уязвимость в Laravel была найдена 7 декабря 2021 года.
{message}