为了账号安全,请及时绑定邮箱和手机立即绑定

如何通过控制器操作和ajax保护文件下载?

如何通过控制器操作和ajax保护文件下载?

C#
茅侃侃 2022-08-20 17:39:02
我有一个应用程序,我希望用户能够上传和下载自己的文件。我实现了上传和下载,但是我担心下载操作的XSS漏洞。我只能使用GET方法实现实际下载的文件,但我想保护它(通常我使用POST +防伪令牌)。我该怎么做?这是我的控制器操作:        public ActionResult DownloadFile(int clientFileId)        {            var clientId = GetClientId(clientFileId);            var client = _unitOfWork.Clients.GetById(clientId);            if (client == null)                return HttpNotFound();            var file = _unitOfWork.ClientFiles.GetById(clientFileId);            if (file == null)                return HttpNotFound();            var practiceId = _unitOfWork.Users.GetPracticeIdForUser(User.Identity.GetUserId());            if (!AuthorizationHelper.CheckBelongsToPractice(_unitOfWork.Clients, typeof(Client),                practiceId, client.Id, nameof(Client.Id), nameof(Client.PracticeId)))                        {                return new HttpUnauthorizedResult();            }            var fileInfo = new FileInfo(file.FilePath);            var fileName = fileInfo.Name;            if (!fileInfo.Exists)                return HttpNotFound();            var path = Path.Combine(Server.MapPath("~/ClientFiles/" + clientId + "/"), fileName);            var contentType = MimeMapping.GetMimeMapping(path);            try            {                var contentDisposition = new System.Net.Mime.ContentDisposition                {                    FileName = fileName,                    Inline = false,                                    };                Response.AppendHeader("Content-Disposition", contentDisposition.ToString());                return File(path, contentType, fileName);            }            catch (Exception ex)            {                new ExceptionlessLogger(ex).Log();                return new HttpStatusCodeResult(500);            }        }
查看完整描述

1 回答

?
炎炎设计

TA贡献1808条经验 获得超4个赞

我在这里找到了答案:https://codepen.io/chrisdpratt/pen/RKxJNo


$('#client-files-table').on('click', '.js-download', function () {

        var link = $(this);        

        $.ajax({

            url: '/clients/clientfiles/downloadfile?clientFileId=' + link.attr('data-clientfile-id'),

            method: 'POST',

            data: {

                __RequestVerificationToken: getToken()                

            },            

            xhrFields: {

                responseType: 'blob'

            },

            success: function (data, status, xhr) {

                var a = document.createElement('a');

                var url = window.URL.createObjectURL(data);

                a.href = url;

                var header = xhr.getResponseHeader('Content-Disposition');

                var filename = getFileNameByContentDisposition(header);

                a.download = filename;

                a.click();

                window.URL.revokeObjectURL(url);

                loadPartials();

            },

            error: function () {

                toastr.error('Unable to download.');

            }

        });            

    });


查看完整回答
反对 回复 2022-08-20
  • 1 回答
  • 0 关注
  • 78 浏览

添加回答

举报

0/150
提交
取消
意见反馈 帮助中心 APP下载
官方微信