上传PDF或.doc和安全性

时间:2010-05-28 04:25:43

标签: php security pdf upload doc

我有一个脚本,允许用户将文本文件(PDF或doc)上传到服务器,然后计划将它们转换为原始文本。但是直到文件被转换,它才是原始格式,这让我担心病毒和各种令人讨厌的东西。

我需要做些什么才能最大限度地降低这些未知文件的风险。如何检查它是否干净,或者它是否是它声称的格式,并且它不会使服务器崩溃。

6 个答案:

答案 0 :(得分:4)

正如我对Aerik的评论,但它确实是问题的答案。

如果你有PHP> = 5.3使用finfo_file()。如果您有旧版本的PHP,则可以使用mime_content_type()(不太可靠)或从PECL加载Fileinfo扩展。

这两个函数都返回文件的mime类型(通过查看其中的数据类型)。对于PDF应该是

text/pdf

对于单词doc,它可能是一些东西。一般来说应该是

application/msword

如果您的服务器正在运行* nix,请确保您保存的文件不可执行。更好的是:将它们保存到Web服务器无法访问的文件夹中。您仍然可以编写代码来访问文件,但是请求网页的人根本无法访问它们。

答案 1 :(得分:2)

如果您曾经在服务器上打开或执行任何用户上传的文件,您应该会发现您的服务器现已受到损害。

即使是JPG也可以包含可执行的php。如果您在脚本中以任何方式includerequire该文件,那么这也会危及您的服务器。你在网上偶然发现的一张照片就像这样......


header('Content-type: image/jpeg');
header('Content-Disposition: inline; filename="test.jpg"');

echo file_get_contents('/some_image.jpg');
echo '<?php phpinfo(); ?>';

...你可以保存并重新托管在自己的服务器上......


$q = $_GET['q']; // pretend this is sanitized for the moment
header('Content-type: '.mime_content_type($q));
header('Content-Disposition: inline; filename="'.$_GET['q'].'"');

include $q;

...将在您的服务器上执行phpinfo()。然后,您的站点用户可以将图像保存到桌面并使用记事本打开它以查看您的服务器设置。只需将文件转换为另一种格式即可丢弃该脚本,并且不应触发附加到该文件的任何实际病毒。

最好在上传时进行病毒搜索。您应该能够对检查器执行内联系统命令并解析其输出以查看它是否找到任何输出。您的网站用户应该检查他们下载的文件。

否则,即使病毒laiden用户上传文件只是坐在你的服务器上也不应该伤害任何东西......据我所知。

答案 2 :(得分:1)

嗯 - 嗯 - 你不应该真的担心文件类型或其他东西;如果你使用一个好的转换器转换为原始文本,那么这个应该做这些检查而不会崩溃服务器。

从客户端计算机上可以看出,应始终保护服务器免受病毒和攻击 - 因此在处理之前要检查新上载的文件。

我从来没有见过网络应用本身做那些检查 - 你呢?

答案 3 :(得分:1)

恕我直言,直到有人试图执行它,它只是一个文件。但是,您可以检查(但不要依赖,如下所述)文件扩展名,还可以研究文件格式,以查看文件头中是否有任何特定的字节序列,您可以验证。< / p>

答案 4 :(得分:1)

如果您正在查看PDF,除了获取防病毒软件和祈祷之外,您无法做任何事情,它会恶意捕获已形成的PDF。

转换软件通常不是针对性的,所以如果您只是转换它并查看文本格式输出,那么您应该更安全一些。


哦,你担心服务器。只是不要执行上传的文件......

答案 5 :(得分:0)

在上传的文件中有3种安全方式: 最好:将文件放在另一台最安全的服务器上 更好:将它们放在WWW文件夹之外,这意味着没有人可以通过URL访问它们,你必须使用readfile()或get_content来读取和显示文件 last:将文件放入WWW并在文件夹中使用.htaccess,以防止其他人执行文件或放入未知文件 这就是我通过上传文件所做的事情; 把它们放在网络根目录的一边,重命名它们甚至在数据库中保存假名,并按算法创建文件的真实名称。

在web root之外上传文件后,您可以像我这样访问它。文件的内容是caleed getfile.php:

    <?php

    define('DS', DIRECTORY_SEPARATOR);
//fake name of file
    $uniqueid = $_GET['uniqueid'];
//file extension
    $ext = $_GET['ext'];
    if (isset($_GET['dir']))
//check address doenot contain ..
        $addrss = str_replace('..', '_', $_GET['dir']);
    $baseaddress = '..' . DS . 'foldername outside of web root';
    if ((isset($_GET['uniqueid']) and strlen($uniqueid) === 32) and ( isset($_GET['ext']) and strlen($ext) === 3 )) {
        $path = $baseaddress . DS . $addrss . DS;
        $path .= md5($uniqueid . $uniqueid . $uniqueid . $ext.'*#$%^&') .'.'. $ext;
        if (file_exists($path)) {
    //you can check for all your accessible extension i just use for img
            switch ($ext) {
                case 'jpg':
                    $content_type = 'image/jpeg';
                    break;
                case 'png':
                    $content_type = 'image/png';
                    break;
                case 'gif':
                    $content_type = 'image/gif';
                    break;
            }
            header('Content-type: ' . $content_type . ' ');
            $file = readfile($path);
        }

在文件src中或您需要显示文件的每个地方执行此操作(这适用于我的图像):

<img src="/getfile.php?uniqueid=put fake file name here&amp;ext=put extension here&amp;dir=put rest of file address here" >

希望它对你有所帮助。不要犹豫,提出更多问题