【问题标题】:Check File Upload extension (PHP/Jquery/Javascript)检查文件上传扩展 (PHP/Jquery/Javascript)
【发布时间】:2011-07-12 10:12:46
【问题描述】:

作为标题,哪个更好,为什么?这样做有什么缺点吗? 我听说 Jquery/Javascript 检查不好,建议使用 PHP,但不知为何不知道为什么....

需要你们任何人的推荐。提前致谢。

谁来看看这是好是坏:

<input type="file" name="task_doc" class="task_doc"  onChange="checkext();"/>

function checkext(){
var permittedFileType = ['pdf', 'doc', 'docx', 'xls', 'xlsx'];
var fext = $(".task_doc").val().split('.').pop().toLowerCase();
var resultFile = validate_filetype(fext, permittedFileType);
    if(resultFile === false){
         $(".task_doc").replaceWith("<input type='file' name='task_doc'    class='task_doc'  onChange='checkext();'>");
        alert("Invalid Extension");

    }
    else{
        alert("Success");
    }
}

function validate_filetype(fext, ftype)
{
    for(var num in ftype)
    {
        if(fext == ftype[num])
            return true;
    }

    return false;
}

【问题讨论】:

    标签: php javascript jquery upload


    【解决方案1】:

    如果您仅使用 javascript 来检查数据有效性,高级用户将有可能上传他们想要的任何数据。

    另一方面,如果用户输入的数据(在这种情况下是文件)无效,则使用 javascript 可能是用户获得快速反馈的便捷方式。

    所以我建议同时使用客户端和服务器端脚本。

    【讨论】:

    • 使用客户端和服务器端脚本是什么意思?可以给我举个例子吗?
    • 不要只依赖文件扩展名,因为扩展名可能会撒谎。例如,如果您需要一张图片,请通过 ImageMagick 或至少 Fileinfo 运行它。
    • Javascript 是客户端脚本。这意味着用户执行代码(或者如果他选择不执行),而 php 通常是服务器端脚本,它的执行完全在您的控制之下。
    • Thomas G. 我已将上述帖子编辑为我目前所做的。这是正确的方法还是我应该怎么做?
    • 您不仅要通知用户文件类型不正确,还要防止数据字段被更改。您还需要确保所有上传的数据在服务器端(在您的 php 脚本中)都是有效的。附带说明:通常更建议通过 id $("#task_doc") 而不是类名来查找表单元素。
    【解决方案2】:

    您必须假设任何外部数据都受到污染并且可能是恶意的。用户可以禁用 JavaScript 并发送他们想要的任何文件。或者用户可以将文件发送到服务器并更改 MIME 类型和/或扩展名以绕过服务器上的检查。

    您最好的选择是确保您的服务器设置为正确处理各种 MIME 类型,而不是默认将未知文件类型解析为 PHP。换句话说,不要将 Apache 设置为将 .php 文件以外的任何内容作为 PHP 处理,并阻止 .php 文件被上传。在安全方面,处理文件上传充其量是一个棘手的情况。我强烈建议将上传文件保存在您的文档根目录之外,将它们重命名为只有您知道的随机字符串(即上传时将随机名称存储在数据库中),然后通过 PHP 将文件发送到浏览器。

    header('Content-Description: File Transfer');
    header('Content-Type: application/octet-stream');
    header('Content-Disposition: attachment; filename=' . basename($filename));
    header('Content-Transfer-Encoding: binary');
    readfile($filename);
    

    我建议这样做,因为将它们存储在文档根目录之外会阻止访问,使用唯一的文件名会阻止某人直接访问它,并且强制下载(应该)阻止恶意文件的任何自动执行,因此希望用户的防病毒能找到吗……

    【讨论】:

      猜你喜欢
      • 2013-01-28
      • 1970-01-01
      • 2017-07-28
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2016-12-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多