在PHP中验证url最安全的方法是什么?


What is the most secure way to validate URLs in PHP?

我正在处理一个代码片段,我需要验证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字符表示。