FILTER_VALIDATE_URL + fopen($url," ") - url验证可能存在的


php Possible weaknesses for FILTER_VALIDATE_URL + fopen($url,"r") - url validation

我的网址将有国际字符,如ş, ğ, ı

在阅读了大量关于url验证问题的文章和博客后,我决定用另一段代码来支持filter_var($url, FILTER_VALIDATE_URL),因为
  1. 如果url有int。字符,url无法验证
  2. http://www.d-mueller.de/blog/why-url-validation-with-filter_var-might-not-be-a-good-idea/由bažmegakapa回复+7.

,然后我总结了这个想法在PHP验证/regex URL

bažmegakapa提供使用

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

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

在这之后我的问题:

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

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

谢谢

事实上,filter_var($url, FILTER_VALIDATE_URL)认为javascript://test%0Aalert(321)有效并不是一个弱点。如果你认为它是,你对filter_var的期望是错误的。

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

  • 不是用来判断URL所指向的资源是否可访问。

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

  • 这并不意味着要考虑该方案(它可能会对超出RFC 2396中描述的url进行限制)。例如while

    • ftp://foo:bar@baz是根据RFC 1738, 3.2 FTP,
    • 的有效FTP URL。
    • http://foo:bar@baz不是一个有效的HTTP URL根据RFC 2616, 3.2.2 HTTP URL(即使一些浏览器可以解释这样的"URLs")。

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

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