0

我网站中的网址将包含国际字符,例如ş, ğ, ı...

在阅读了很多关于 url 验证问题的帖子和博客之后,我决定支持filter_var($url, FILTER_VALIDATE_URL)另一段代码,因为

  1. 如果 url 有 int. 字符,网址无法验证
  2. http://www.d-mueller.de/blog/why-url-validation-with-filter_var-might-not-be-a-good-idea/bažmegakapa回答+7。

然后我决定在PHP 验证/正则表达式中使用这个想法来获取 URL

bažmegakapa 提供使用

if (preg_match("#^https?://.+#", $link) and @fopen($link,"r")) echo "OK";

查看链接是否可以打开,则表示它已通过验证。

在此之后我的问题:

问题 -我喜欢这个想法,在我看来它非常棒。但是在看到它只有+7并且那个页面有+>>7个答案之后,我想问一下php大师的想法是什么?他们很乐意回答这个问题以帮助像我这样的人;新秀。

bažmegakapa 的代码有什么弱点吗?例如,我不知道,但是否有任何 url 无法打开它,但实际上它是一个无害的、必须验证的 url?那么,你发现的弱点有什么解决方法呢?

谢谢你

最好的祝福

4

1 回答 1

2

filter_var($url, FILTER_VALIDATE_URL)认为有效的事实javascript://test%0Aalert(321)不是弱点。如果您认为是,那么您对用途的期望filter_var是错误的。

filter_var($url, FILTER_VALIDATE_URL)根据RFC 2396验证 URL 的语法。

  • 这并不意味着确定 URL 指向的资源是否可访问。

  • 当 URL 由用户提供时,它并不意味着确定使用 URL 作为 HTML 文档元素中的href属性值是否安全。a

  • 这并不意味着考虑该方案(这可能会对超出RFC 2396中描述的 URL 施加限制)。例如,虽然

filter_var不烤蛋糕,也不煮咖啡。如果您需要蛋糕或咖啡,请使用其他东西(RFC 2324是一个好的开始)。

根据具体情况,显示指向服务器无法访问的资源的 URL 可能是个好主意,也可能是个坏主意。根据具体情况,显示不指向 HTTP 或 HTTPS 资源的 URL 可能是个好主意,也可能是个坏主意。一种尺寸并不适合所有人。

于 2013-04-11T09:40:24.387 回答