用户给的文件名能直接用吗?secure_filename 清洗了什么、没清洗什么?中文名为什么变成空?这篇用真实的写文件演示路径穿越,并用 2 万个随机输入验证清洗后是否安全。
输入 → 输出 'report.pdf' → 'report.pdf' 'my report 2024.pdf' → 'my_report_2024.pdf' '../../etc/passwd' → 'etc_passwd' '..\\..\\windows\\system32\\cmd.exe' → 'windowssystem32cmd.exe' '/absolute/path/x.txt' → 'absolute_path_x.txt' '.htaccess' → 'htaccess' '..hidden' → 'hidden' 'a/b/c.txt' → 'a_b_c.txt' '中文报告.docx' → 'docx' 'résumé.pdf' → 'resume.pdf' 'file name (1).txt' → 'file_name_1.txt' 'a\x00b.txt' → 'ab.txt' 'a\nb.txt' → 'a_b.txt' 'CON' → 'CON' 'con.txt' → 'con.txt' 'NUL.txt' → 'NUL.txt' 'AUX' → 'AUX' 'COM1.txt' → 'COM1.txt' 'LPT1' → 'LPT1' ' .txt ' → 'txt' 'xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx → 'xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx'(长度 304) '' → '' '...' → '' '.' → '' 'tar.gz' → 'tar.gz' 'a.tar.gz' → 'a.tar.gz' '版本.v2.txt' → 'v2.txt' 'emoji😀.png' → 'emoji.png' '$HOME/x' → 'HOME_x' 'name;rm -rf.txt' → 'namerm_-rf.txt'
上一篇:上传文件大小限制;下一篇:Response 对象构造过程;上传类型校验见文件上传类型校验,路径穿越与下载见路径穿越与文件下载。
secure_filename('中文报告.docx') → 'docx'
secure_filename('中文') → ''
secure_filename('你好.txt') → 'txt'filename='../escaped.txt' → 实际写入 <实验目录>/fltmp/f38/escaped.txt(是否在上传目录里面:False) filename='../../escaped2.txt' → 实际写入 <实验目录>/fltmp/escaped2.txt(是否在上传目录里面:False) 上传目录之外多出的文件: ['escaped.txt']
测试 20030 个输入(其中 339 个清洗后为空串),越出上传目录的有 0 个
safe_name('photo.PNG' ) → 'c6d3fbce362d.png'
safe_name('a.exe' ) → None
safe_name('中文.jpg' ) → None
safe_name('noext' ) → None
safe_name('../x.pdf' ) → 'abcd5a3723e4.pdf'
safe_name('archive.tar.gz' ) → Nonesafe_join(上传目录, 'a.txt' ) → '<uploads>/a.txt' safe_join(上传目录, 'sub/a.txt' ) → '<uploads>/sub/a.txt' safe_join(上传目录, '../x' ) → None safe_join(上传目录, '/etc/passwd' ) → None safe_join(上传目录, 'sub/../../x' ) → None safe_join(上传目录, 'a/../a.txt' ) → '<uploads>/a.txt' safe_join(上传目录, '' ) → '<uploads>'