检查文件上传扩展名(PHP / Jquery / Javascript)

时间:2011-03-10 03:30:37

标签: php javascript jquery upload

作为标题哪个更好,为什么?这样做的任何弱点? 我听说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;
}

2 个答案:

答案 0 :(得分:5)

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

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

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

答案 1 :(得分:1)

您必须假设任何外部数据都受到污染,并且可能是恶意的。用户可以禁用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);

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