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

时间:2015-10-16 15:47:27

标签: php validation url filter-var

我正在处理一个代码段,我需要验证网址,因此我知道我正在将数据发送到正确的网址,因此我使用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))行中有问题。 我需要澄清如何正确使用这个。感谢

1 个答案:

答案 0 :(得分:4)

首先,只验证输入。永远不要消毒输入。在准备好输出之前不要进行消毒。这是一个全面处理数据的一般规则,对于安全地显示URL同样重要,因为它可以防止XSS攻击,SQL注入等。

其次,FILTER_VALIDATE_URL根据RFC 2396验证URL。该RFC没有指定任何特定的方案,尽管它确实给出了几个例子(即HTTP:,GOPHER:,MAILTO:等)。 validate filters上的PHP手册明确指出:

  

请注意,有效的URL可能未指定HTTP协议http://因此可能需要进一步验证以确定URL使用预期协议,例如ssh://或mailto:。

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

验证某些定义良好的数据的最安全方法是将其列入白名单。如果你真的想确保没有人通过你“tt:com.google.xssHackHere”,那么你需要自己进一步检查。请注意,如果您要验证域名以及方案,现在有数百个有效的TLD,并且并非所有TLD都能以ASCII字符轻松表示。