【问题标题】:How can I block a user from viewing certain files on a server in their browser?如何阻止用户在浏览器中查看服务器上的某些文件?
【发布时间】:2021-07-28 02:25:03
【问题描述】:

我有一个 ASP.Net MVC 应用程序,当用户请求时(通过 http 请求)动态生成 xml 文件。唯一的问题是它还会将它们写入本地存储的文件中。所以我真的有两个问题:

  1. 是否可以不在本地写入文件但仍将响应与文件一起发送给客户端

  2. 或者我可以阻止用户输入文件 URL 并在他们的浏览器上查看它,例如 example.com/test.xml

我有一个身份验证系统来控制某些视图的访问,但我不知道如何为没有视图的东西执行此操作

当前写入文件和发送响应的方式:

[AcceptVerbs(HttpVerbs.Get)]
public void SendXML()
{
    if(!User.Identity.IsAuthenticated)
    {
        return;
    }

    string path = Server.MapPath("~/Temp/test.xml");

    using (Stream s = File.Open(path, FileMode.OpenOrCreate))
    {
        using (XmlWriter writer = XmlWriter.Create(s, settings))
        {
            // Write Xml Document
        }
    }

    Response.ContentType = "text/xml";
    Response.TransmitFile(path);
}

当前发送请求的方式:

var xmlhttp = new XMLHttpRequest();
xmlhttp.onreadystatechange = function() {
    if(this.readyState == 4 && this.status == 200){
        // Good
    }
};
xmlhttp.open("GET", "http://example.com/MyController/SendXML", true);
xmlhttp.send();

【问题讨论】:

    标签: c# asp.net-mvc xmlhttprequest


    【解决方案1】:

    是否可以不在本地写入文件但仍然发送 仅向客户端响应文件

    是的。有可能的。一旦您将 XML 放入字符串中。您可以将XML 字符串转换为byte array,然后再转换为octet stream 并从API 发送,而不是将该XML 写入文件并发送。这将为最终用户下载文件,并且您不会将任何内容存储到文件系统

    var xml = @"<root></root>";
    byte[] xmlBytes = System.Text.Encoding.UTF8.GetBytes(xml);
    var stream = new MemoryStream(xmlBytes); 
    return File(stream, "application/octet-stream", "DownloadName.xml");
    

    或者我可以阻止用户输入文件 URL 并在 他们的浏览器,例如 example.com/test.xml

    这取决于,您可以有多种选择。您可以集成身份验证机制(如 cookie 身份验证)或令牌身份验证(如 IdentityServer),以促进受保护的端点。如果您有受保护的端点,则可以将访问权限限制为仅特定用户。

    【讨论】:

    • 这个方法是否维护了xml的结构?
    • 会的。下载的文件中会出现什么 XML 字符串。如果你想要缩进,你需要在你的 XML 字符串上有 "\n" 和 "\t"
    猜你喜欢
    • 2013-06-28
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-01-02
    • 1970-01-01
    • 1970-01-01
    • 2016-10-01
    • 2013-01-28
    相关资源
    最近更新 更多