上传的文件应该是只读(read-only)或读写(read-write)的,永远不应该可执行(executable)。
如果你的网站根目录是/var/www/example.com
,请不要保存上传文件在/var/www/example.com/uploaded_files
。
而应该保存到一个不能直接访问的目录(例如:/var/www/example.com-uploaded/
),以免意外地将其作为服务器端脚本执行,并获得执行远程代码的后门,最好上传到第三方存储介质。
一个更加简洁的方法是将网站根目录(统一入口文件)往下移动一个层级(即:/var/www/example.com/public
)。
强制后缀名,判断后缀名与上传的mine-type是否一致(不一致就可判断是伪装的),如果是图片格式,检测文件头。上传后强制重命名.
上传的文件不要保存为原名,要保存为对方猜不到的文件名(如文件加盐hash或随机字符串+文件hash,不带扩展名),和原名一起保存在数据库里。
如PHP 通过php.ini控制