假设我想构建一个简单的 PHP 脚本,让我可以访问文件夹中的文件:
$path = $_GET['path'];
$path = str_replace('..', '', $path);
$path = "./static/" . $path;
readfile($path);
此示例中的第 2 行是否足以避免人们读取“静态”文件夹之外的文件?
假设我想构建一个简单的 PHP 脚本,让我可以访问文件夹中的文件:
$path = $_GET['path'];
$path = str_replace('..', '', $path);
$path = "./static/" . $path;
readfile($path);
此示例中的第 2 行是否足以避免人们读取“静态”文件夹之外的文件?
我目前想不出删除所有“..”字符串不起作用的充分理由,但最合适的方法是使用realpath()函数并确保字符串的开头与预期的完整目录路径匹配。
攻击者很容易以..
多种方式对文字字符串进行编码。最简单的方法是使用编码..
为%2E%2E
. 这不会被捕获,str_replace
并且仍将解析为恶意路径。有关更多示例,请参阅OWASP 路径遍历页面。
realpath()
对于这种情况,通常是更好的解决方案。