我正在研究在PHP中编写与Perl兼容的正则表达式,以检查给定字符串是否是有效的URL。
现在它正如预期的那样工作,但我想知道是否有任何预防措施我应该用它来检查它是否对用户输入是安全的。 $url
变量按原样提交,如纯文本。
这是整个功能:
private function real_url($url) {
return preg_match("/(http|https):\/\/(.*?)\.[a-zA-Z]{2,6}/i",$url);
}
我只想检查http
和https
。我并不担心ftp
,irc
等。只是网络链接。
它还会检查TLD的持续时间。 So "google.asdfasdfasdf"
将返回false
,但google.asdf"
将返回true
。我该如何解决这个问题? ".asdf"
显然不是有效的TLD。
我只需要知道两件事:
答案 0 :(得分:5)
您应该使用filter_var
代替:
private function real_url($url) {
return filter_var($url, FILTER_VALIDATE_URL) !== FALSE;
}
注意,这不会验证该方案是否被允许(例如http / https),也不会验证顶级域是否存在。
验证域实际有效的最简单方法是进行DNS查找,例如使用checkdnsrr
:
private function validate_domain($domain) {
return checkdnsrr($domain, "A");
}
答案 1 :(得分:1)
它还检查.something有多长。所以google.asdfasdfasdf会 返回false但google.asdf将返回true。我该怎么解决这个问题, 因为.asdf显然不是域名。
仅 100%可靠地检查给定网址是否有效的方法是尝试并访问。
任何其他方法(例如filter_var
)只能检查语法的有效性,并且不会将DNS的更改考虑在内(例如新gTLD)。
查看PHP中的curl
函数。理想情况下,您应首先组合filter_var
(检查语法),并尝试访问URL以检查提供的URL是否确实存在。
答案 2 :(得分:0)
你的问题毫无意义。您是否知道目前hundreds of extensions are in process of validation并且无法跟上所有人的步伐。
这里有两个步骤:
请查看 Public Suffix计划。解析TLD列表。在脚本中实现它。并保持最新:)
答案 3 :(得分:-1)
唯一可以确定的方法是查询whois服务器(或Google site:domain.com)并检查域是否存在。 (.*?)
几乎可以匹配所有内容,域名必须是[a-z0-9\-\_]
,但不能以hypen或下划线开头(你也需要正则表达式)。
@Alnitak
function check($url){
$curl = curl_init();
curl_setopt($curl, CURLOPT_URL, $url);
curl_setopt($curl, CURLOPT_NOBODY, 1);
curl_setopt($curl, CURLOPT_HEADER, 1);
curl_setopt($curl, CURLOPT_RETURNTRANSFER, 1);
$data = curl_exec($curl);
curl_close($curl);
return $data;
}
echo check("http://qwertgzhgfdsdfghjhzgtf.com");
将不返回任何内容,否则将返回标题。
echo (check('http://stackoverflow.com') != '')? ':)': ':(';