Валидация (безопасных) URL-адресов
Валидатор 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-адресов, отправляемых пользователями, но стоит обсудить этот вопрос и обеспечить его выполнение, если это возможно.