Хобрук: Ваш путь к мастерству в программировании

Каков самый безопасный способ проверки URL-адресов в PHP?

Я работаю над фрагментом, и мне нужно было проверить URL-адреса, чтобы я знал, что отправляю данные на правильный URL-адрес, для этого я использую функцию filter_var().

Я начал сталкиваться с проблемами, когда начал тестировать, это мой код;

<?php

function post($webLink){

    $url = filter_var($webLink, FILTER_SANITIZE_URL);

    if (filter_var($url, FILTER_VALIDATE_URL)) {

        echo 'Correct';
    }

    else {

        echo 'Please check your url.';
    }

}

    post('h://www.google.com');
?>

Многие недействительные ссылки подтверждены как правильные URL-адреса, включая текущий.

Ссылки, которые прошли проверку:

    ht1tp://www.google.com
    h://ww.google.com
    http://www.google.
    http://www.google.343

Я отказываюсь верить, что это функция, проверяющая правильность этих ссылок, мне хотелось бы думать, что что-то не так в моей строке if (filter_var($url, FILTER_VALIDATE_URL)). Мне нужно разъяснение о том, как правильно использовать это, пожалуйста. Спасибо


  • Вы читали описание FILTER_VALIDATE_URL? php.net/manual/en/filter.filters.validate.php 16.10.2015
  • Если вы хотите проверить правильность URL-адреса, а не просто его внешний вид, вам, вероятно, понадобится что-то вроде checkdnsrr() php.net/manual/en/function.checkdnsrr.php - хотя даже в этом случае я не думаю, что это будет обрабатывать новые доменные имена UTF-8 16.10.2015
  • Возможно, вам также придется добавить сюда parse_url(). Он может анализировать протокол/схему, чтобы вы могли убедиться, что это http или https. 16.10.2015
  • @u_mulder Да, я проверил, но я не ожидал, что URL-адрес без суффикса .com будет проходить как действительный URL-адрес, и он не проверяет URL-адрес без присутствия «что-то: //». 16.10.2015
  • @Ifeoluwa: http://com.google - это действительный URL-адрес, просто говорю. 16.10.2015
  • @RocketHazmat wtf, не ожидал, лол 16.10.2015
  • @castis: Да, Google подал заявку на несколько рДВУ. Они также являются реестром доменов. См.: registry.google/about/faqs.html. 16.10.2015
  • если FILTER_VALIDATE_URL не то, что вы ищете, что означает действительно? не ответ 4XX? 16.10.2015

Ответы:


1

Во-первых, только проверить ввод. Никогда не дезинфицируйте ввод. Не дезинфицируйте, пока он не будет готов к выходу. Это общее правило обработки данных по всем направлениям, и оно так же важно для безопасного отображения URL-адресов, как и для предотвращения XSS-атак, SQL-инъекций и тому подобного.

Во-вторых, FILTER_VALIDATE_URL проверяет URL-адреса на основе RFC 2396. Этот RFC не определяет какой-либо конкретной схемы, хотя и дает несколько примеров (например, HTTP:, GOPHER:, MAILTO: и т. д.). В руководстве PHP по проверке фильтров прямо указано:

Помните, что допустимый URL-адрес может не указывать протокол HTTP http://, поэтому может потребоваться дополнительная проверка, чтобы определить, что URL-адрес использует ожидаемый протокол, например. ssh:// или mailto:.

Кроме того, RFC не определяет структуру доменных имен и не предполагает каких-либо конкретных доменов верхнего уровня. Таким образом, фильтр проверки не проверяет их. Имена доменов формально назначаются регистраторами в соответствии с правилами ICANN, но вы можете настроить свой собственный локальный DNS-сервер для создания любых записей, которые вы хотите, в том числе создавать записи только для TLD, таким образом, любые доменное имя является действительным, независимо от того, проходит ли оно фильтр проверки или нет.

Самый безопасный способ проверить некоторые четко определенные данные — внести их в белый список. Если вы действительно хотите удостовериться, что никто не передает вам «http:com.google.xssHackHere», вам нужно будет выполнить дальнейшую проверку самостоятельно. Имейте в виду, что в настоящее время существует несколько сотен действительных TLD, и не все из них легко выразить в символах ASCII, если вы хотите проверить доменные имена, а также схему.

16.10.2015
  • Пояснение: более тысячи действительных TLD: stats.research.icann.org/dns/tld_report (1080 на сегодняшний день) 16.10.2015
  • Хм, хорошо. Другими словами: на самом деле нет способа проверить URL-адреса с помощью php-функций, не разрабатывая их самостоятельно. Я понял, спасибо всем. 16.10.2015
  • Новые материалы

    Я собираюсь научить вас Python шаг за шагом
    Привет, уважаемый энтузиаст Python! 👋 Готовы погрузиться в мир Python? Сегодня я приготовил для вас кое-что интересное, что сделает ваше путешествие более приятным, чем шарик мороженого в..

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

    React on Rails
    Основное приложение Reverb - это всеми любимый монолит Rails. Он отлично обслуживает наш API и уровень просмотра трафика. По мере роста мы добавляли больше интерактивных элементов..

    Что такое гибкие методологии разработки программного обеспечения
    Что представляют собой гибкие методологии разработки программного обеспечения в 2023 году Agile-методологии разработки программного обеспечения заключаются в следующем: И. Введение A...

    Ториго  — революция в игре Го
    Наш следующий вызов против ИИ и для ИИ. Сможет ли он победить людей в обновленной игре Го? Обратите внимание, что в следующей статье AI означает искусственный интеллект, а Goban  —..

    Простое развертывание моделей с помощью Mlflow — Упаковка классификатора обзоров продуктов NLP от HuggingFace
    Как сохранить свои модели машинного обучения в формате с открытым исходным кодом с помощью MLFlow, чтобы позже получить возможность легкого развертывания. Сегодня модели упаковки имеют несколько..

    Математика и интуиция - Часть 1
    У каждой математической формулы есть доказательство. Часто эти доказательства слишком сложно понять, поскольку многие из них основаны на индукции, некоторые - на очень сложных наблюдениях, а..