Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/php/295.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
PHP:过滤不带协议的绝对路径URL的输入或正则表达式_Php_Regex_Url_Preg Match_Filter Input - Fatal编程技术网

PHP:过滤不带协议的绝对路径URL的输入或正则表达式

PHP:过滤不带协议的绝对路径URL的输入或正则表达式,php,regex,url,preg-match,filter-input,Php,Regex,Url,Preg Match,Filter Input,我到处都在找,http://或www。。。URL,但对于服务器内部使用的链接没有任何内容 在我的情况下,我需要清理/验证如下路径: /folder1/folder2/.../file.ext 例如: /img/<"?">/ /img/content/.../file.ext<script>alert("Script")</script> 请找一个正则表达式向导帮我解决这个问题。谢谢。使用正则表达式测试URI、电子邮件地址和其他此类复杂标识符是一个棘手的问

我到处都在找,http://或www。。。URL,但对于服务器内部使用的链接没有任何内容

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

/folder1/folder2/.../file.ext
例如:

/img/<"?">/

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

请找一个正则表达式向导帮我解决这个问题。谢谢。

使用正则表达式测试URI、电子邮件地址和其他此类复杂标识符是一个棘手的问题:它要求您阅读并完全理解所有可能涉及的系统的规范;跟踪所有上述系统的任何变更;并更新你的代码,只要它在网上可用。 简言之:这是一项巨大的投资,你必须跟进

也就是说,您可以在这个URL上使用FILTER\u VALIDATE\u URL,只需将file:protocol前缀添加到URL即可

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

tmp$ls-l 总数0 -rw-rw-r-1基督教10月25日15:52


顺便说一句,这是一个很好的例子,说明了为什么在我试图解决您的问题之前,应该始终使用输出转义。

:尝试使用正则表达式防止XSS攻击不是一个好主意。。。您只需清理输出即可。@TomLord验证输入应始终执行,因为链中的一个链接称为security。输出转义是另一个链接,它可以防止XSS。这两种方法都应始终应用。@ChristianF在本例中,唯一合理的输入验证方法是字符串表示有效的文件路径,您建议如下。我的观点是,使用正则表达式来寻找所有类似的东西几乎不可能完美,只会给代码增加大量的复杂性,没有什么好处。@TomLord啊,我明白了。我还编辑了我的答案,以扩展这个差异、测试的局限性以及需要进一步测试/保护的内容。
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)