【问题标题】:filter_var incorrect for URLsURL 的 filter_var 不正确
【发布时间】:2023-04-01 05:45:01
【问题描述】:

我正在尝试使用 filter_var 来验证用户输入的 URL,但它似乎并非在所有情况下都有效。我已请求对此some time ago on PHP.net 进行修复,但无济于事。

除了正则表达式(是的,stackoverflow 上已经发布了一些)之外,是否有可以工作的 PHP 版本或任何其他方法?

我面临的问题是以下字符串得到验证,这不应该:

http://http://www.google.com

测试脚本:

$url = $_REQUEST['url'];

if (filter_var("http://" . $url, FILTER_VALIDATE_URL)) 

   $filter="true"; 

else 

   $filter="false";

echo "Filter var result of concat with http is:" . $filter . "<br>";

预期结果:

我希望当我使用 http://www.google.com 运行脚本时它返回 false,而当我使用 www.google.com 运行它时返回 true

实际结果:

两种情况都返回真

【问题讨论】:

  • 您的filter_var 代码是什么样的?
  • 您在哪里请求修复此行为?
  • 它是 bugs.php.net/bug.php?id=64173 。电子邮件哈希匹配。

标签: php regex url


【解决方案1】:

我有一个小类用于更严格的 URL 验证。还不如放到公共领域:

https://github.com/franksrevenge/StrictUrlValidator

它依赖于一些逻辑测试,然后通过测试给定主机名是否存在,甚至通过向服务器查询 URL 的状态代码来变得越来越具有侵入性。当然,远程查询的行为是可配置的。

【讨论】:

    【解决方案2】:

    如果您报告的错误有任何问题,filter_var() 会通过解析 parse_url() 并检查结果数组是否正常来验证 url。

    因此,如果您想要更严格的东西,请将它们重新粘合在一起并验证它们是否相等。

    这是一个合理的glue_url函数:

    http://doc.habariproject.org/inputfilter_8php_source.html#l00324

    然后:

    $valid_url = ($url == glue_url(parse_url($url)));
    

    如果没有提供协议,还可以检查"http://$url"

    【讨论】:

      猜你喜欢
      • 2014-10-09
      • 2015-05-06
      • 1970-01-01
      • 1970-01-01
      • 2020-06-15
      • 1970-01-01
      • 2016-04-11
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多