【问题标题】:URL redirection: Server side redirection to a directory/folder in IEURL 重定向:服务器端重定向到 IE 中的目录/文件夹
【发布时间】:2011-01-02 02:16:54
【问题描述】:

我正在实现一个 URL 缩短器,例如 bit.ly。为此,我有一个 Java servlet 后端,它为每个重定向请求执行 response.redirect(targetURL)

这适用于 HTTP 请求,但我遇到了 file:// 协议的问题。有问题的情况是这样的:

  1. 目标是一个目录(例如file:///N:/somefolder,其中N:是一个网络驱动器)
  2. 客户端浏览器为IE

对于 Firefox,这很好用,目录列表显示在浏览器中,就好像我在地址栏中输入了“file:///n:/somefolder”一样(并且我已将我的服务器添加到 Firefox 的受信任 URI 列表中)

对于 IE,如果我在浏览器中输入“file:///n:/somefolder”并按 Enter,它会打开一个新的资源管理器窗口。这是我在进行服务器端重定向时想要的确切行为,但这根本行不通。我收到“IE 无法打开...”错误。

这不可能吗?或者是否有一些类似于 Firefox 首选项的设置将我的服务器添加到“可信”URL 列表中以进行重定向?

请注意,如果目标是文件,例如 'file:///n:/somefolder/test.doc',即使在 IE 中也可以正常工作!

提前致谢!

【问题讨论】:

    标签: internet-explorer browser servlets bit.ly


    【解决方案1】:

    出于安全原因,应限制从远程资源到本地资源的重定向,但并非所有浏览器都正确执行此操作。

    有关漏洞利用示例,请参阅此公告,

    https://www.kb.cert.org/vuls/id/713878

    【讨论】:

      【解决方案2】:

      由于安全限制,这是不可能的。如果服务器机器也可以在java.io 级别访问这些资源,那么您可以自己充当某种代理。只需创建一个Servlet,它使用FileInputStream 获取它的InputStream,并将其连同一组正确的标题一起写入HttpServletResponseOutputStream

      下面是这样一个 servlet 的 doGet() 的样子:

      String filename = request.getPathInfo();
      File file = new File("n:/somefolder", filename);
      
      response.setContentType(getServletContext().getMimeType(file.getName()));
      response.setContentLength(file.length());
      
      BufferedInputStream input = null;
      BufferedOutputStream output = null;
      
      try {
          input = new BufferedInputStream(new FileInputStream(file));
          output = new BufferedOutputStream(response.getOutputStream());
      
          byte[] buffer = new byte[1024];
          for (int length = 0; (length = input.read(buffer)) > 0;) {
              output.write(buffer, 0, length);
          }
      } finally {
          if (output != null) try { output.close(); } catch (IOException logOrIgnore) {}
          if (input != null) try { input.close(); } catch (IOException logOrIgnore) {}
      }
      

      将此 servlet 映射到 url-pattern 上,例如 /files/*,并使用 http://example.com/contextname/files/test.doc 调用它。您可以找到here 另一个基本示例。

      【讨论】:

      • 我知道我不是 Servlet 的能手,所以如果这听起来很愚蠢,请原谅我:你给出的看起来像一个文件 servlet。我要问的是 - 为什么可以做一个 response.redirect("N:/somefolder/somefile.doc") 但不是 response.redirect("N:/somefolder") - 在 Internet Explorer 上? (两者都在 Firefox 上工作)我在这里看不到相关性......
      【解决方案3】:

      嗯,我的问题没有得到任何令人满意的答案。我发现了一种在 IE 中重定向到目录时有效的解决方法:让您的服务器发送到目标的链接,而不是实际的重定向。例如。服务器发送表单的html

      <a href="file:///N:/somefolder">click here</a>
      

      这需要用户额外点击一次,但会起作用。

      【讨论】:

        猜你喜欢
        • 2016-07-19
        • 1970-01-01
        • 2020-01-08
        • 2018-09-30
        • 2011-09-18
        • 2011-10-07
        • 2013-07-06
        • 2011-01-25
        • 1970-01-01
        相关资源
        最近更新 更多