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

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

我正在处理一个片段,我需要验证 URLs,所以我知道我正在将数据发送到正确的 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');
?>

许多无效链接被验证为正确的网址,包括当前链接。

经过验证的链接是;

    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: 等) . validate filters 上的 PHP 手册明确指出:

Beware a valid URL may not specify the HTTP protocol http:// so further validation may be required to determine the URL uses an expected protocol, e.g. ssh:// or mailto:.

另外,RFC 没有定义域名的结构,也不期望任何特定的顶级域。因此,验证过滤器不检查那些。域名由注册服务商按照 ICANN 规则正式分配,但您可以自由配置自己的本地 DNS 服务器以创建您想要的任何条目,包括创建仅限 TLD 的条目,因此 任何域名有效的,无论是否通过验证过滤器。

验证某些明确定义的数据的最安全方法是将其列入白名单。如果你真的想确保没有人超过你 "ht&nbsp;tp:com.google.xssHackHere" 那么你需要自己做进一步的检查。请注意,现在有数百个有效的 TLD,如果您想验证域名和方案,并不是所有的 TLD 都可以轻松地用 ASCII 字符表示。