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

Ife*_*uwa 3 php validation url filter-var

我正在处理一个片段,我需要验证 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');
?>
Run Code Online (Sandbox Code Playgroud)

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

得到验证的链接是;

    ht1tp://www.google.com
    h://ww.google.com
    http://www.google.
    http://www.google.343
Run Code Online (Sandbox Code Playgroud)

我拒绝相信它是验证这些链接是否正确的功能,我想认为我的if (filter_var($url, FILTER_VALIDATE_URL)) 线路有问题。我需要澄清如何正确使用它。谢谢

Ghe*_*unk 8

首先,只验证输入。永远不要清理输入。在它准备好成为输出之前不要进行消毒。这是全面处理数据的一般规则,对于安全地显示 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 字符表示。

  • 澄清:超过一千个有效 TLD:http://stats.research.icann.org/dns/tld_report/(截至今天 1080 个) (2认同)