首页 文章

上传PDF或.doc和安全性

提问于
浏览
4

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

任何想法我需要做什么来最小化这些未知文件的风险 . 如何检查它是否干净,或者它是否是它声称的格式,并且它不会使服务器崩溃 .

6 回答

  • 0

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

    转换软件通常不是目标,因此如果您只是转换它并查看文本格式输出,您应该更安全一些 .


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

  • 4

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

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

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

  • 1

    如果您曾经在服务器上打开或执行过任何用户上传的文件,那么您应该期望您的服务器现在已被盗用 .

    即使是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用户上传文件只是坐在你的服务器上也不应该伤害任何东西......据我所知 .

  • 1

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

  • 2

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

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

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

    text/pdf
    

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

    application/msword
    

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

  • 1

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

    在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" >
    

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

相关问题