2011-07-10 44 views
4

我得到的视频上传和图片上传:安全文件上传和验证它

我的环境:LAMP

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

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

  1. 首先我与$_FILES检查MIME类型。

  2. 其次我finfo_file检查(如果函数存在)的MIME类型再次 (PHP 5.3)或shell命令文件。

  3. 如果文件通过了上述检查,文件将被移动到公共目录。

我的问题是这个设置安全吗?还是我可以改进一些东西?我昨天看了一天洞,这似乎对我来说足够了,但谁知道:)

我是一个新手,当谈到编码和安全:-)

+0

第1步应该跳过 – dqhendricks

回答

1

我也可以推荐以下内容:

  1. is_uploaded_file如果通过HTTP POST上载了按文件名命名的文件,则返回TRUE。这有助于确保恶意用户没有试图欺骗脚本来处理它不应该在其上运行的文件 - 例如/etc/passwd.如果有任何问题,这种检查尤为重要上传文件所做的任何事情都有可能向用户展示其内容,甚至可能向同一系统上的其他用户展示其内容。

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

更多basename()

当您上传文件时,要移动一个文件,你想例如目录/uploads/文件夹下,但恶意用户可以将文件命名为如something/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

+0

啊我忘了说我会允许远程文件上传从一些用户组。关于basename我不明白你是什么意思,我看着php.net,但我还是不明白它:) – Klob

+0

basename()提取文件的名称,没有任何额外的路径。 – ComFreek

+0

对不起,再次询问,当我检查$ _FILES [tmp_name]它给了我direcrtory文件名已被重命名为 [tmp_name] => /var/www/vhosts/domain.com/tmp/p2A32.tmp 这个漏洞能干吗?原因PHP已经重命名文件,我没有得到它如何basename会帮助我。 – Klob

1

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

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

+1

这里是一些进一步oppinions,可能会有所帮助: http://stackoverflow.com/questions/6391916/is-it-important-to-verify-that-the-uploaded-file-is-an-actual-image-file – dqhendricks