Nat*_*ate 5 php security file-upload
我一直在阅读PHP文件上传安全性,一些文章建议重命名文件.例如,OWASP文章Unrestricted File Upload 说:
建议使用算法来确定文件名.例如,文件名可以是文件名的MD5哈希值加上一天的日期.
如果用户上传名为的文件,Cake Recipe.doc是否真的有任何理由将其重命名为45706365b7d5b1f35?
如果答案是肯定的,无论出于何种原因,那么如何跟踪原始文件名和扩展名?
Jac*_*b S 13
对于您的主要问题,重命名文件是一个好习惯,答案肯定是肯定的,特别是如果您要创建一个文件存储库形式,用户上传他们选择的文件(和文件名),原因如下:
Cake Recipe.doc不是URL安全名称,并且可以在某些系统(服务器或浏览器端)/某些情况下,当名称应为urlencoded值时导致不一致. 至于存储信息,你通常会在数据库中执行此操作,这与您已经存在的需求没有什么不同,因为您需要一种方式来引用回文件(谁上传,名称是什么,偶尔存储它的位置,上传的时间,有时是大小).除了文件的用户名之外,您只需添加文件的实际存储名称即可.
OWASP建议并不错 - 使用文件名和时间戳(不是日期)将是最独特的.我更进一步,将microtime包含在时间戳中,并经常包含其他一些独特的信息,以便在同一时间范围内重复上传小文件 - 我还会存储上传日期这是针对md5冲突的附加保险,它在存储许多文件和多年的系统中具有更高的概率.你不可能在同一天使用文件名和microtime生成两个像md5s.一个例子是:
$filename = date('Ymd') . '_' . md5($uploaded_filename . microtime());
Run Code Online (Sandbox Code Playgroud)
我的2美分.