【问题标题】:Generating a file, then launching a secure download生成文件,然后启动安全下载
【发布时间】:2009-04-07 13:13:26
【问题描述】:

在 asp.net 2.0 (VB) 环境中工作,我已经有了可以从数据库为网站的特定“用户”生成 excel 文件的代码。我希望能够按需启动此报告生成器,然后在生成文件后,允许用户下载此文件。

我怎样才能安全地做到这一点,而不仅仅是将文件转储到某个公共可读的目录中?

注意:与this question相关,但我真正感兴趣的部分从未得到答复。

【问题讨论】:

    标签: asp.net security excel download


    【解决方案1】:

    您可以创建一个允许您进行授权的 HTTP 处理程序,而不是将其放在公共目录中。

    您可以通过在 web.config 中编译和注册或创建 ashx 页面来创建处理程序。然后您的页面将授权用户,然后将内容写入响应。

    如果您需要会话状态,请务必从 IRequiresSessionState 继承。

    编辑

    我是 C# 人,所以这里有一个示例:

    public class DownloadFile : IHttpHandler, System.Web.SessionState.IRequiresSessionState
    {
    
        public void ProcessRequest (HttpContext context) {
        //Validate user is authenticiated and authorized.
        if (context.Request.IsAuthenticated)
        {
             //This is your own custom authorization mechanism
             if (AuthorizeUser(context.Request.User))
             {
                //not sure what the correct content type is. This is probally wrong
                context.Response.ContentType = "application/xls";
                //Setting size is optional               
                context.Response.AddHeader("Content-Disposition",
                   "attachment; filename=" + downloadName + "; size=" +               myExcellFile.Length.ToString());
                context.Response.BinaryWrite(myExcellFile);
    
    
             }
    
        }
    

    【讨论】:

      【解决方案2】:

      使用 Http 处理程序(*.ashx 文件)。将生成文件的代码移动到处理程序,在生成文件之前检查安全性,设置appropriate content-type and content-disposition headers,然后使用Response.BinaryWrite 将文件直接发送到浏览器。切勿将其放在服务器的文件系统中。

      【讨论】:

      • 好点,除非生成文件需要很长时间,他可能需要一个两步过程。
      • 我们生成的其中一些文件在 60 秒以上的范围内。
      • 如果您可以计算或估计结果的大小,这仍然是可行的方法,因为您可以定期刷新响应缓冲区。这将使文件更快地提供给用户,并有助于减少服务器磁盘上的内存。
      • 这可能是更巧妙的解决方案,但需要重构一些我不想乱用的代码。绝对有趣,我可能会在某个时候重新审视这一点。感谢您的回答。
      【解决方案3】:

      你能...吗?

      1. 在私人(用户无法访问)文件夹中创建您的 excel 文件
      2. 向用户返回与 Excel 电子表格相关联的唯一 URL(不容易猜到)
      3. 在您的应用程序中处理该 url 请求并将 excel 电子表格流式传输给调用方(相应地更改响应的内容类型)

      这将允许您让这些 url 超时,甚至在需要时重新生成 excel 电子表格。

      【讨论】:

        猜你喜欢
        • 2018-08-20
        • 2010-10-23
        • 1970-01-01
        • 2012-06-05
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多