【问题标题】:PHP url validation false positivesPHP url 验证误报
【发布时间】:2015-05-11 23:25:09
【问题描述】:

出于某种奇怪的原因,我使用 FILTER_VALIDATE_URL 检查 url 的 if 语句返回了意外的结果。

https://www.google.nl/ 之类的简单内容已被阻止,但 www.google.nl/ 不是?它也不喜欢它阻止每个带有 http 或 https 的 URL。有些是允许的,有些是不允许的,我知道有很多主题,但其中大多数都使用正则表达式来过滤 url。这比使用 FILTER_VALIDATE_URL 更好吗?还是我做错了什么?

我用来检查网址的代码是这样的

if (!filter_var($linkinput, FILTER_VALIDATE_URL) === FALSE) {
    //error code
}

【问题讨论】:

标签: php regex validation


【解决方案1】:

你应该先像这样过滤它。 (只是为了衡量)。

$url = filter_var($url, FILTER_SANITIZE_URL);

FILTER_VALIDATE_URL 只接受 ASCII URL(即需要编码)。如果上述功能不起作用,请参阅 PHP urlencode() 对 URL 进行编码。

如果 THAT 不起作用,那么您应该像这样从头开始手动剥离 http: ...

$url = strpos($url, 'http://') === 0 ? substr($url, 7) : $url;

这里有一些可能会有所帮助的标志。如果您的所有网址都包含http://,您可以使用FILTER_FLAG_SCHEME_REQUIRED

FILTER_VALIDATE_URL 过滤器验证 URL。

可能的标志:

  • FILTER_FLAG_SCHEME_REQUIRED - URL 必须符合 RFC(如 http://example
  • FILTER_FLAG_HOST_REQUIRED - URL 必须包含主机名(如http://www.example.com
  • FILTER_FLAG_PATH_REQUIRED - URL 必须在域名后有路径(如 www.example.com/example1/)
  • FILTER_FLAG_QUERY_REQUIRED - URL 必须有一个查询字符串(例如“example.php?name=Peter&age=37”)

FILTER_VALIDATE_URL 的默认行为

  • 将值验证为 URL(根据 » http://www.faqs.org/rfcs/rfc2396),可选,需要 成分。

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

  • 请注意, 函数只会发现 ASCII URL 是有效的;国际化 域名(包含非 ASCII 字符)将失败。

【讨论】:

猜你喜欢
  • 2018-02-03
  • 2012-05-13
  • 2014-06-16
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2012-11-16
  • 1970-01-01
相关资源
最近更新 更多