Валидация (безопасных) URL-адресов

Источник: «Security Tip: Validating (Secure) URLs!»
Знаете ли вы, что валидатор URL в Laravel позволяет контролировать какие протоколы принимаются? Вот моя рекомендация...

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

Сегодня рассмотрим валидатор url, проверяющий, содержат ли поля ввода корректные URL-адреса, и позволяющий определить допустимые протоколы для указанных URL-адресов.

По умолчанию валидатор url разрешает всё, что похоже на URL:

Validator::make(
['link' => "https://evilhacker.dev"], // input
['link' => 'url'] // rule
)->passes();
// => TRUE

Validator::make(
['link' => "steam://evilhacker.dev"], // input
['link' => 'url'] // rule
)->passes();
// => TRUE

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

Чтобы обойти эту проблему, достаточно указать валидатору, какие протоколы ему разрешены, например, затребовать http и https адреса следующим образом:

// Не валидная ссылка

Validator::make(
['link' => "steam://evilhacker.dev"], // input
['link' => 'url:http,https'] // rule
)->passes();
// => FALSE

// Валидная ссылка

Validator::make(
['link' => 'http://evilhacker.dev'], // input
['link' => 'url:http,https'] // rule
)->passes();
// => TRUE

Рекомендую сделать ещё один шаг вперёд и по возможности требовать HTTPS адреса для всех вводимых пользователем данных.

Это позволит убедиться, что все ссылки, отправленные пользователем, предназначены для безопасных (т. е. зашифрованных) сайтов, и обезопасит пользователей от атак на понижение уровня и т. д. Это может быть невероятно важно, если приложение работает с конфиденциальными данными (например, PII, PHI и т. д.) и отправляет пользователей на внешние сайты, которые также должны взаимодействовать с этими данными.

// Не валидная ссылка

Validator::make(
['link' => "http://evilhacker.dev"], // input
['link' => 'url:https'] // rule
)->passes();
// => FALSE

// Валидная ссылка

Validator::make(
['link' => 'https://evilhacker.dev'], // input
['link' => 'url:https'] // rule
)->passes();
// => TRUE

В зависимости от потребностей бизнеса, возможно, не удастся обеспечить использование только HTTPS для URL-адресов, отправляемых пользователями, но стоит обсудить этот вопрос и обеспечить его выполнение, если это возможно.

Дополнительные материалы

Предыдущая Статья

Пресеты архитектурного тестирования в Pest 3

Следующая Статья

Оптимизация производительности Laravel с утилитой Benchmark