Защита с помощью filter_var

Я начал изучать веб-разработку и нашел это:

filter_var('php://', FILTER_VALIDATE_URL);

Но они сказали это:

Недостаток в приведенном выше заключается в том, что в параметрах фильтра нет способа ограничения разрешенной схемы URI, и пользователи ожидают, что это будет один из http, https или mailto, а не какой-то общий специфичный для PHP URI. Это своего рода общий подход к валидации, который мы должны стремиться избегать любой ценой.

Источник : Проверка ввода

Мои вопросы :

  • Я до сих пор не понимаю, почему это следует избегать?
  • Кто-нибудь может привести примеры атак на это, что я могу имитировать?

Примечание: это мой первый пост, поэтому прошу прощения, если у него много вопросов.

Спасибо.

2

Решение

var_dump(filter_var('testing://123.com', FILTER_VALIDATE_URL));

не ложь Это ваш ответ 🙂 Вы не хотите говорить нормально URL, который не входит в зарегистрированную схему.

Так что этот комментарий по сути означает, что даже если filter_var будет искать правильный формат URL, он не сможет правильно судить, хороша ли схема URL, и многие плохие URL все еще могут пройти, так как это универсальный тип. Это все равно, что сказать, что номер телефона в США состоит из 10 цифр, да, хорошо, если это единственный чек, тогда 1111111111 также является действительным номером телефона?

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

  if(filter_var($url, FILTER_VALIDATE_URL) && parse_url($url, PHP_URL_SCHEME)=="http")
1

Другие решения

Как насчет этого для примера

filter_var('javascript://test%0Aalert(321)', FILTER_VALIDATE_URL) !== false; //true
0

По вопросам рекламы [email protected]