簡體   English   中英

使用filter_var驗證帶和不帶協議的URL

[英]Validating URL with and without protocol with filter_var

我試圖使用PHP的filter_var()擴展來驗證。 根據http://php.net/manual/en/filter.filters.validate.php

將值驗證為URL(根據» http://www.faqs.org/rfcs/rfc2396 ),可選地使用必需的組件。 請注意,有效的URL可能未指定HTTP協議http://因此可能需要進一步驗證以確定URL使用預期的協議,例如ssh://或mailto:。 請注意,該函數只能找到有效的ASCII URL; 國際化域名(包含非ASCII字符)將失敗。

關於, 請注意,有效的URL可能未指定HTTP協議 ,我的測試表明需要HTTP協議( URL 'stackoverflow.com/' is NOT considered valid. )。 我怎么會誤解文檔?

此外,如何阻止https:// https://stackoverflow.com/等URL驗證是否為true?

PS。 對我對消毒協議進行消毒的方法提出任何意見將不勝感激。

<?php
function filterURL($url) {
    echo("URL '{$url}' is ".(filter_var($url, FILTER_VALIDATE_URL)?'':' NOT ').'considered valid.<br>');
}
function sanitizeURL($url) {
    return (strtolower(substr($url,0,7))=='http://' || strtolower(substr($url,0,8))=='https://')?$url:'http://'.$url;
}

filterURL('http://stackoverflow.com/');
filterURL('https://stackoverflow.com/');
filterURL('//stackoverflow.com/');
filterURL('stackoverflow.com/');
filterURL(sanitizeURL('http://stackoverflow.com/'));
filterURL(sanitizeURL('https://stackoverflow.com/'));
filterURL(sanitizeURL('stackoverflow.com/'));

filterURL('https://https://stackoverflow.com/');
?>

OUTPUT:

URL 'http://stackoverflow.com/' is considered valid.
URL 'https://stackoverflow.com/' is considered valid.
URL '//stackoverflow.com/' is NOT considered valid.
URL 'stackoverflow.com/' is NOT considered valid.
URL 'http://stackoverflow.com/' is considered valid.
URL 'https://stackoverflow.com/' is considered valid.
URL 'http://stackoverflow.com/' is considered valid.
URL 'https://https://stackoverflow.com/' is considered valid.

FILTER_VALIDATE_URL使用parse_url() ,它不幸地將'https://https://'解析為有效的URL(因為它實際上是一個考慮URIs RFC的有效URL):

var_dump(parse_url('https://https://stackoverflow.com/'));

array(3) { 
  ["scheme"]=> string(5) "https" 
  ["host"]=> string(5) "https"
  ["path"]=> string(20) "//stackoverflow.com/" 
}

您可以將sanitazeURL功能更改為:

function sanitizeURL($url) {
  return (parse_url($url, PHP_URL_SCHEME)) ? $url : 'http://' . $url;
}

但是你還是要檢查主機名是不是http還是https

function filterURL($url) {
  echo("URL '{$url}' is ".((filter_var($url, FILTER_VALIDATE_URL) !== false && (parse_url($url, PHP_URL_HOST) !== 'http' && parse_url($url, PHP_URL_HOST) !== 'https'))?'':' NOT ').'considered valid.<br>');
}

您可以刪除http或通過驗證是否存在來添加它。

<?php
$url = "http://www.nigeriatest.com";

// Remove all illegal characters from a url
$url = filter_var($url, FILTER_SANITIZE_URL);

// Validate url
if (!filter_var($url, FILTER_VALIDATE_URL) === false) {
    echo("$url is a valid URL");
} else {
    echo("$url is not a valid URL");
}
?>

我怎么會誤解文檔?

該規范沒有說明沒有協議 - 它只是聲明協議可能不是HTTP。

你在報價中剁掉了句子的重要部分......

請注意,有效的URL可能未指定HTTP協議http:// 因此可能需要進一步驗證以確定URL使用預期的協議

期望協議,它可能也可能不是 HTTP。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM