我正在处理一个代码片段,我需要验证URL,以便我知道我正在将数据发送到正确的URL,为此我使用filter_var()
函数。
当我开始测试时,我开始遇到这个问题,这是我的代码;
<?php
function post($webLink){
$url = filter_var($webLink, FILTER_SANITIZE_URL);
if (filter_var($url, FILTER_VALIDATE_URL)) {
echo 'Correct';
}
else {
echo 'Please check your url.';
}
}
post('h://www.google.com');
?>
大量无效链接被验证为正确的url,包括当前url。
被验证的链接是;
ht1tp://www.google.com
h://ww.google.com
http://www.google.
http://www.google.343
我拒绝相信它是验证这些链接是正确的函数,我想认为我的if (filter_var($url, FILTER_VALIDATE_URL))
行有问题。我需要澄清如何正确使用这个请。由于
首先,只验证输入。永远不要净化输入。在准备好成为输出之前不要进行消毒。这是全面处理数据的一般规则,对于安全显示url和防止XSS攻击、SQL注入等同样重要。
第二,FILTER_VALIDATE_URL基于RFC 2396验证url。该RFC没有指定任何特定的方案,尽管它确实给出了几个例子(即HTTP:, GOPHER:, MAILTO:等)。关于验证过滤器的PHP手册明确地声明:
注意一个有效的URL可能没有指定HTTP协议http://,所以可能需要进一步的验证来确定URL使用预期的协议,例如ssh://或mailto:。
而且,RFC没有定义域名的结构,也没有期望任何特定的顶级域。因此,验证过滤器不会检查这些。域名由注册商按照ICANN规则正式分配,但您可以自由配置自己的本地DNS服务器来创建您想要的任何条目,包括创建仅限tld的条目,因此任何域名都是有效的,无论它是否通过验证过滤器。
验证一些定义良好的数据的最安全的方法是将其列入白名单。如果你真的想确保没有人给你"ht tp:com.google。xssHackHere",那么您需要自己做进一步的检查。请注意,如果您想验证域名和方案,现在有几百个有效的tld,并不是所有的tld都容易用ASCII字符表示。