PHP:filter_input或regex表示没有协议的绝对路径URL

时间:2016-10-25 12:47:32

标签: php regex url preg-match filter-input

我到处寻找,http://或www ... URL有很多正则表达式,但服务器内部使用的链接没有任何内容。

在我的情况下,我需要清理/验证路径,如:

/folder1/folder2/.../file.ext

以便例如:

/img/<"?">/

/img/content/.../file.ext<script>alert("Script")</script>

无效。这意味着有效的是以“/”开头的路径,后跟文件夹有效名称和“/”的组合,以文件名和扩展名结尾。

PHP的内置FILTER_VALIDATE_URL或FILTER_SANITIZE_URL不接受这样的路径作为有效的URL。所以我想我必须使用正则表达式。

filter_var($url, FILTER_VALIDATE_REGEXP, array("options"=>array("regexp"=>"/ ... /"))))

这个正则表达式向导的人可以帮助我。谢谢。

1 个答案:

答案 0 :(得分:-1)

使用正则表达式来测试URI,电子邮件地址和其他此类复杂标识符之类的内容是一个毛茸茸的主张:它要求您阅读并完全了解所有可能涉及的系统的规范;跟踪所有所述系统的任何变化;并且只要网上有可用的代码就更新代码 简而言之:这是一笔巨大的投资,关键是你要跟进它。

也就是说,只需在网址中添加FILTER_VALIDATE_URL协议前缀,就可以使用file:

php > $st = "file://home/test";
php > var_dump (filter_var ($st, FILTER_VALIDATE_URL));
string(16) "file://home/test"
php > $st2 = "/home/test";
php > var_dump (filter_var ($st2, FILTER_VALIDATE_URL));
bool(false)

完成后,您就会知道给定的字符串符合合法的URL架构,该架构描述了本地文件资源。如果没有,那么您可以告诉用户给定的路径不是有效路径 然后,您可以检查路径是否是现有路径,以及用户有权访问的路径。您可能还希望在路径名上添加进一步的限制,以避免特殊字符的未知问题。在任何情况下,总是使用适当的方法将输出转义到目标系统。

至于你认为无效的路径名:

  

tmp $ touch'&lt;“?”&gt;'

     

tmp $ ls -l <​​br/>   共0   -rw-rw-r-- 1 christian christian 0 Oct 25 15:52&lt;“?”&gt;

一个很好的例子,说明为什么总是应该使用输出转义,顺便说一句。