【问题标题】:PHP: filter_input or regex for absolute path URL without protocolPHP:没有协议的绝对路径 URL 的 filter_input 或正则表达式
【发布时间】:2016-10-25 12:47:32
【问题描述】:

我到处都在寻找,有大量用于 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"=>"/ ... /"))))

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

【问题讨论】:

  • 在我尝试“解决您的问题”之前:尝试使用正则表达式来防止 XSS 攻击不是一个好主意……您应该简单地清理输出。
  • @TomLord 无论如何都应该验证输入,因为链中的链接之一称为安全性。输出转义(确实可以防止 XSS)是另一个链接。两者都应始终应用。
  • @ChristianF 在这种情况下,唯一合理的输入验证(以及您在下面建议的)是字符串表示有效的文件路径。我的观点是,使用正则表达式来查找像 &lt;script&gt; 这样的所有内容几乎不可能完美,只会给您的代码增加巨大的复杂性而没有太大的好处。
  • @TomLord 啊,那我明白了。我还编辑了我的答案,以扩展这种差异、测试的局限性以及需要进一步的测试/保护。

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


【解决方案1】:

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

也就是说,您可以在此使用FILTER_VALIDATE_URL,只需将file: 协议前缀添加到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 christian christian 0 Oct 25 15:52

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

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2023-01-23
    • 2011-11-25
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2018-01-09
    • 2013-11-02
    • 1970-01-01
    相关资源
    最近更新 更多