从字符串中删除“..”是否足以避免目录遍历攻击?

信息安全 php 目录遍历
2021-09-07 05:15:27

假设我想构建一个简单的 PHP 脚本,让我可以访问文件夹中的文件:

$path = $_GET['path']; $path = str_replace('..', '', $path); $path = "./static/" . $path; readfile($path);

此示例中的第 2 行是否足以避免人们读取“静态”文件夹之外的文件?

2个回答

我目前想不出删除所有“..”字符串不起作用的充分理由,但最合适的方法是使用realpath()函数并确保字符串的开头与预期的完整目录路径匹配。

攻击者很容易以..多种方式对文字字符串进行编码。最简单的方法是使用编码..%2E%2E. 这不会被捕获,str_replace并且仍将解析为恶意路径。有关更多示例,请参阅OWASP 路径遍历页面。

realpath() 对于这种情况,通常是更好的解决方案。