定义和用法
move_uploaded_file() 函数将上传的文件移动到新位置。
若成功,则返回 true,否则返回 false。
语法
move_uploaded_file(file,newloc)
参数 | 描述 |
---|---|
file | 必需。规定要移动的文件。 |
newloc | 必需。规定文件的新位置。 |
说明
本函数检查并确保由 file 指定的文件是合法的上传文件(即通过 PHP 的 HTTP POST 上传机制所上传的)。如果文件合法,则将其移动为由 newloc 指定的文件。
如果 file 不是合法的上传文件,不会出现任何操作,move_uploaded_file() 将返回 false。
如果 file 是合法的上传文件,但出于某些原因无法移动,不会出现任何操作,move_uploaded_file() 将返回 false,此外还会发出一条警告。
这种检查显得格外重要,如果上传的文件有可能会造成对用户或本系统的其他用户显示其内容的话。
提示和注释
注释:本函数仅用于通过 HTTP POST 上传的文件。
注意:如果目标文件已经存在,将会被覆盖。
来自w3c的介绍,下面说说我遇到的问题。
一般来说,我们都会这样写保存文件:
$fileName = $_SERVER['DOCUMENT_ROOT'].'/Basic/uploads/'.$_FILES['file']['name'];move_uploaded_file($_FILES['file']['tmp_name'],$fileName )先解释,这两句代码的含义: 直接保存文件,同时文件名也为用户上传的文件名
好了,这下子风险来了:
①直接保存文件。
这意味着不对文件进行任何识别,如果有用户上传了一段后台代码保存为jpg后缀或者其他,要是管理员一不注意将其以php映射,然后访问这个后台,- -结果可想而知,要是他在后台中执行删除所有数据库,整个网站直接GG。总之直接保存文件有很大风险。
②使用与用户文件名相同的文件名。
上述代码如果用户使用中文文件名,则会报错。
一牵涉到文件名,就牵涉到编码,要是文件名是英文+数字还好,如果包含中文那就头大了,要重新对其编码。
我认为可靠的保存,应该是这样的:
①要对用户上传的文件进行识别。
文件识别,这个部分有很多功能,我觉得用MIME type就很好,这个也很难伪造。
②要将文件名改换。
我觉得最好改成时间的格式像“201634104421”这种文件名,也可以将文件名与数据库相对应起来。