os.path.basename不能防御路径遍历,因其仅字符串截断不解析语义,对../../../etc/passwd返回passwd,拼接后仍越权;必须用os.path.realpath归一化路径并校验是否落在白名单目录内。

为什么 os.path.basename 不能挡住路径遍历
直接用 os.path.basename 提取用户传入的文件名,看似“只留最后一段”,实则完全无效。它只是字符串截断,不解析路径语义——对 ../../../etc/passwd,os.path.basename 返回的仍是 passwd;后续拼接时,/var/www/uploads/ + 'passwd' 还是会落到错误位置。
更糟的是,它对 URL 编码(%2e%2e%2f)、Unicode 点号(../)、空字节(