2015-06-01 8 views
9

Sto tentando di convalidare utilizzando l'estensione di PHP filter_var(). Per http://php.net/manual/en/filter.filters.validate.php:Convalida dell'URL con e senza protocollo con filter_var

valore Convalida come URL (secondo » http://www.faqs.org/rfcs/rfc2396), eventualmente con richieste componenti. Fare attenzione a un URL valido potrebbe non specificare il protocollo HTTP http: // quindi potrebbe essere necessaria un'ulteriore convalida per determinare l'URL utilizza un protocollo previsto, ad es. ssh: // o mailto :. Si noti che la funzione troverà validi gli URL ASCII; i nomi di dominio internazionalizzati (contenenti caratteri non ASCII) non avranno esito positivo.

Per quanto riguarda, Guardatevi un URL valido non può specificare il protocollo HTTP, il mio test di seguito indicano che è necessario un protocollo HTTP (URL 'stackoverflow.com/' is NOT considered valid.). Come sto interpretando male la documentazione?

Inoltre, in che modo è impedito la convalida di URL come https://https://stackoverflow.com/ true?

PS. Sarebbero apprezzati eventuali commenti sul mio approccio di sanificazione del protocollo.

<?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/'); 
?> 

USCITA:

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. 
+0

L'ultimo causa alcuni problemi: 'https: // https: // stackoverflow.com /'. Quale versione di PHP stai usando? –

+0

[Eval.in: PHP - PHP 5.5.14, incollato proprio ora] (https://eval.in/private/c0fba9b3d8befb). Non è quello che ci si aspetta. –

+0

L'URL valido può specificare qualsiasi protocollo ** altro ** rispetto a HTTP, ma il protocollo è ancora obbligatorio. –

risposta

2

FILTER_VALIDATE_URL utilizza parse_url(), che analizza sfortunatamente 'https://https://' come un URL valido (come realmente è uno valido considerando URI RFC):

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

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

Si potrebbe cambia la tua funzione sanitazeURL in:

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

ma ancora si devono verificare se il nome host non è né httphttps:

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>'); 
} 
+1

@ "usa la corretta espressione regolare" Fai attenzione che 'https: // https: //stackoverflow.com/' è in effetti un URL valido. ':' Dopo che il nome host è stato utilizzato per la porta e il percorso potrebbe contenere '//'. – Basti

+1

È vero. Aggiornerò la mia risposta ... –

0

È possibile rimuovere il http o aggiungerlo dalla convalida esso esiste o non.

<?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"); 
} 
?> 
+0

Quindi anche "WHAtEvErhttp: // www.nigeriatest.com' è un URL valido, perché" filter_var() 'con flag" FILTER_VALIDATE_URL' semplicemente non si cura della convalida del protocollo ... Inoltre, che senso ha eliminare i personaggi illegali quando vogliamo verificare se è valido o no? Se contiene caratteri non validi, di sicuro non è valido ... –

0

Come sono io interpretando male la documentazione?

Le specifiche non dicono nulla di non avere un protocollo - semplicemente dichiara che il protocollo potrebbe non essere HTTP.

È taglio del pezzo importante della frase nel tuo preventivo ...

Attenzione un URL valido non può specificare il protocollo HTTP http: // così ulteriore convalida può essere richiesto per determinare il URL utilizza un protocollo previsto

un protocollo è previsto , è può o non può essere HTTP.