安全文件上传并验证它

时间:2011-07-10 11:24:33

标签: php security file-upload

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

我的环境:LAMP

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

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

  1. 首先,我使用$_FILES mime类型进行检查。

  2. 其次,我再次使用finfo_file(如果函数存在)检查mimetype (PHP 5.3)或shell命令文件。

  3. 如果文件通过上述检查,则会将文件移至公共目录。

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

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

2 个答案:

答案 0 :(得分:1)

我还可以推荐以下内容:

  1. is_uploaded_file如果文件名命名的文件是通过HTTP POST上传的,则返回TRUE。这有助于确保恶意用户没有试图欺骗脚本处理它不应该工作的文件 - 例如/etc/passwd。如果有任何检查,这种检查尤其重要使用上传文件完成任何操作的机会可能会向用户显示其内容,甚至可能向同一系统上的其他用户显示内容。

  2. basename()函数只获取文件名,例如basename(c:/fakepath/something.avi); // will return something.avi,因为有些人试图通过提供类似目录的文件名来欺骗计算机。

  3. 有关basename()的更多信息:

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

    $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

答案 1 :(得分:1)

只要您使用自己的文件名和扩展名重命名,并且在您的应用代码中没有包含类型漏洞(即:include($ _ GET ['whatever']);),这是相当不错的。您还需要确保服务器堆栈上的所有内容都是最新版本(尤其是处理图像/视频的任何内容)。

其他人会建议包含一个输出文件的文件服务脚本,而不是将文件保存在公共文件夹中,并直接在src属性中引用该文件。有些人还建议病毒扫描一切。