Xeo*_*oss 6 php filenames sanitization file-upload utf-8
我正在尝试处理用户上传的文件的名称.我想支持所有有效的UTF-8字符,除了那些可能在HTML网页上显示,通过CLI界面访问或在文件系统上存储和检索时出现问题的字符.
无论如何,我提出了以下的宽松功能,我想知道它是否足够安全使用.我为所有数据库查询使用预处理语句,我总是html编码我的输出,但我仍然想知道这也是一个深思熟虑的方法.
// $filename = $_FILES['file']['name'];
$filename = 'Filename 123;".\'"."la\l[a]*(/.jpg
? E?da = Q, n ? ?, ? f(i) = ? g(i), ?x??: ?x? = ???x?, ? ? ¬? = ¬(¬? ? ?),
? ? ?? ? ? ? ? ? ? ? ?, ? < a ? b ? c ? d ? ? ? (A ? B),
2H? + O? ? 2H?O, R = 4.7 k?, ? 200 mm
sfajs,-=[];\',./09???????
????????????
???????? ?????, ?????
()_+{}|":?><';
// Replace symbols, punctuation, and ASCII control characters like \n or [BEL]
$filename = preg_replace('~[\p{S}\p{P}\p{C}]+~u', ' ', $filename);
Run Code Online (Sandbox Code Playgroud)
这种方法对我来说是否安全,适合我的用户?
为了澄清,我不使用文件名作为文件系统上文件的名称.我生成一个唯一的哈希并使用它 - 我只需要保存用户befit的原始名称,因为这是他们识别他们的文件.SHA1哈希或UUID对他们来说并不意味着什么.
您需要做的第一件事是检查您的输入是否为UTF-8。
mb_internal_encoding和mb_check_encoding是你的朋友。
当使用允许输入的白名单是良好的安全实践时,您正在使用黑名单。
澄清后编辑:
你应该安全了。如果您不想召唤Zalgo,请记住过滤Lm
and 。No