PHP: безопасен ли FILTER_VALIDATE_URL для проверки URL-адресов?

#php #security #validation #filter-var

#php #Безопасность #проверка #filter-var

Вопрос:

Я использую это для проверки URL-адресов:

 if(!filter_var($website, FILTER_VALIDATE_URL)) {
// invalid url
} else 
   //url valid 
  

Это безопасно?
После прочтения этого: http://www.d-mueller.de/blog/why-url-validation-with-filter_var-might-not-be-a-good-idea / Боюсь, что нет.

Так безопасно ли предоставляемое решение?:

 function validate_url($url)
{
    $url = trim($url);

    return ((strpos($url, "http://") === 0 || strpos($url, "https://") === 0) amp;amp;
            filter_var($url, FILTER_VALIDATE_URL, FILTER_FLAG_SCHEME_REQUIRED | FILTER_FLAG_HOST_REQUIRED) !== false);
}
  

Комментарии:

1. Такие вещи, как межсайтовый скриптинг, SQL injetcion (хотя я использую PDO) и т.д.

Ответ №1:

В документации это не указано, но возвращаемое значение представляет собой исправленную копию URL-адреса.

Т.е.

 <?php
echo filter_var('http://example.com/exploit.html?<script>alert(1);</script>', FILTER_VALIDATE_URL);
//http://example.com/exploit.html?
  

Поэтому, если вы работаете с возвращаемым значением filter_var() , вы безопаснее, чем работать с URL, предоставленным filter_var() .