【问题标题】:file extension verification in java script [duplicate]java脚本中的文件扩展名验证[重复]
【发布时间】:2012-12-11 04:18:47
【问题描述】:

可能重复:
How can the file extension be validated in an input type file using JQuery?

这是我的文件扩展验证码,以防止上传不需要的文件

有没有更简单的编码方法?

有人可以改进吗?

<script>
function onSubmitForm(re) {
    var formDOMObj = document.frmSend;
    var file1 = formDOMObj.attach1.value;

    var pdf=file1.toLowerCase().lastIndexOf(".pdf");
    var doc=file1.toLowerCase().lastIndexOf(".doc");
    var docx=file1.toLowerCase().lastIndexOf(".docx");
    var xls=file1.toLowerCase().lastIndexOf(".xls");
    var xlsx=file1.toLowerCase().lastIndexOf(".xlsx");
    var wps=file1.toLowerCase().lastIndexOf(".wps");


    if (file1  == "" )
    {
        alert("Please pick a file.")
        return false;
    }
    else
    if ( pdf == -1 && doc == -1 && docx == -1 && xls == -1 && xlsx == -1 && wps == -1 )
    {
        alert("File not acceped. Please upload your RESUME in .pdf, .doc, or docx")
        frmSend.reset(re);
        return false;
    }
    else
        return true;
}
</script>

【问题讨论】:

  • 一定要在服务器上验证;攻击者可能只是禁用您的客户端验证码并上传受限文件。
  • 尽管如此,如果您的设置方式使得恶意上传实际上可能会导致问题,那么您就会遇到更大的问题。 (回复:@voithos 的评论)
  • @minitech: alias attacker='naughty-user'

标签: javascript


【解决方案1】:

为了简化:

var extension = file1.split('.').pop().toLowerCase();
var allowed = ['pdf', 'doc', 'docx', 'xls', 'xlsx', 'wps'];

if(allowed.indexOf(extension) === -1) {
    // Not valid.
}

当然,文件不一定包含其扩展名所说的内容。

【讨论】:

  • +1 为.split().pop() 获取扩展名
  • 我猜你可以从该列表中删除xlsx... ;-)
  • @Arjan: ...为什么?那是allowed.indexOf,顺便说一句:)
  • 如果上传一个名为“pdf”的文件怎么办? ^^
  • @Glutamat:嗯,就是这样! :D 不过,重命名文件很容易,所以不妨假设 pdf 是 PDF :) 虽然,为了正确起见:if(file1.indexOf('.') === -1 || allowed.indexOf(extension) === -1) { ... }
【解决方案2】:

正则表达式很强大。

function onSubmitForm(re) {
    var formDOMObj = document.frmSend;
    var file1 = formDOMObj.attach1.value;

    var acceptedTypes = ["pdf", "doc", "docx", "xls", "xlsx", "wps"];
    var re = new RegExp("\\.(" + acceptedTypes.join("|") + ")$");

    if (file1  == "" )
    {
        alert("Please pick a file.")
        return false;
    }
    if (!re.test(file1))
    {
        alert("File not acceped. Please upload your RESUME in .pdf, .doc, or docx")
        frmSend.reset(re);
        return false;
    }
    return true;
}​

【讨论】:

  • 不应该是!re.test(file1) 吗?
  • 是的,应该。已更新,谢谢。
  • 可能希望在此之前包含\.,以确保不接受.rdoc(或其他)文件。 (不过,对于客户端验证而言,这并不是一个大问题。)
  • 确实,但谁知道 =)
【解决方案3】:

您不需要此代码在您的标签中使用接受

<input type="file" accept="application/pdf,application/msword">

【讨论】:

  • accept 应该包含 MIME 类型,而不是扩展名。
  • 我的错,已更正,谢谢@minitech
  • 并且:对于不依赖文件扩展名来确定文件类型的操作系统更加友好。
  • 你是对的@Arjan solid,因为 Rocks 操作系统不依赖文件扩展名。
  • 我真的不确定accept 是否适用于 Word 文档,以及可能识别或不识别它们的浏览器(/操作系统?)。例如,在我的 Linux 上的 Firefox 中,这不会过滤任何内容。
【解决方案4】:

您还可以将扩展名分配给 var 和 在它上面做一个开关盒,这样你也可以处理不同的动作,如果你愿意,那是另一种可能的更短的解决方案

function onSubmitForm(re) {
    var formDOMObj = document.frmSend;
    var file1 = formDOMObj.attach1.value;
    var ext = file1.match(/\.(.+?)$/)
    ext = ext == null ?"NONE": ext.ext[1].toLowerCase();

    switch (ext) {
        case "":
            alert("Please pick a file.")
            return false;
        case "pdf":
        case "doc":
        case "docx":
        case "xls":
        case "xlsx":
        case "wps":
            return true;
        default:
            alert("File not acceped. Please upload your RESUME in .pdf, .doc, or docx")
            frmSend.reset(re);
            return false;
    }

}

【讨论】:

  • 上传没有扩展名的文件怎么办?
  • 您可能希望在索引之前添加一个空检查
  • @fastreload Thx,刚刚意识到这一点,长度检查就可以了,不是吗? @Arjan 它会遇到默认情况
  • 不会的,match方法在没有匹配的时候返回null而不是[];我想这是因为在if 语句中使用它,因为!![]true!!nullfalse
  • 哦,没错,它会导致长度检查的类型错误。嗯,这很有趣,从来没有想过为什么它会返回null,而不是[]
【解决方案5】:

我认为直接使用正则表达式更容易阅读:

function onSubmitForm(re) {
    var formDOMObj = document.frmSend;
    var file1 = formDOMObj.attach1.value;

    if (file1  == "" )
    {
        alert("Please pick a file.")
        return false;
    }
    if (!/\.(doc|docx|pdf|wps|xls|xlsx)$/.test(file1))
    {
        alert("File not acceped. Please upload your RESUME in .pdf, .doc, or docx")
        frmSend.reset(re);
        return false;
    }
    return true;
}

【讨论】:

  • 我不确定其他人,但这确实说 “file1 以 .doc 或 .docx 或 .pdf ...”结尾,比某些更简洁的答案。
猜你喜欢
  • 2012-09-29
  • 2013-09-03
  • 1970-01-01
  • 2018-11-26
  • 1970-01-01
  • 2011-04-07
  • 2012-09-12
  • 2014-11-06
  • 1970-01-01
相关资源
最近更新 更多