php – 安全文件上传并验证它

我收到视频上传和图片上传:

我的环境:LAMP

编辑:我将允许远程上传和POST视频上传

EDIT2:我得到的文件将被重命名,我不会存储原始文件名.

>首先我用$_FILES检查mime类型.
>其次我再次使用finfo_file(如果函数存在)检查mimetype
(PHP 5.3)或shell命令文件.
>如果文件通过了上述检查,则文件将被移动到公共目录.

我的问题是这个设置安全吗?或者我能改进一下吗?我昨天读了这个洞,这对我来说似乎足够了,但谁知道:)

编码和安全时我是新手:-)

最佳答案 我还可以推荐以下内容:

> is_uploaded_file如果文件名命名的文件是通过HTTP POST上传的,则返回TRUE.这有助于确保恶意用户没有试图欺骗脚本处理它不应该工作的文件 – 例如/etc/passwd.如果有任何检查,这种检查尤其重要使用上传文件完成的任何操作可能会向用户显示其内容,甚至可能向同一系统上的其他用户显示内容.
> basename()函数只获取文件名,如basename(c:/fakepath/something.avi); //将返回something.avi,因为有些人试图通过提供类似目录的文件名来欺骗计算机.

有关basename()的更多信息:

当您上传文件时,您希望将文件移动到所需的目录,例如/ uploads /文件夹下,但恶意用户可以将文件命名为/ hello.jpg,然后使用move_uploaded_file移动文件时( $source,$destionation)你的$destination将是/uploads/something/hello.jpg并且会导致问题.为确保只获得正确的文件名,您需要使用basename()函数,该函数返回hello.jpg等.

$file_name = basename($_FILES["upload_ctrl"]["name"]);
if(!move_uploaded_file($_FILES["upload_ctrl"]["tmp_name"],"uploads/".$file_name))
    echo "Opps I cannot upload the file";

有关basename的使用,请访问:http://php.net/manual/en/function.basename.php

点赞