Contribute to this guideReport an issue

指南保护公开访问的文件夹

在集成 CKFinder 时,您通常希望允许用户访问上传的文件,以便他们可以在编辑的内容中插入图像或文件链接。这可以通过两种方式完成

  • 您可以使用 Proxy 命令配置您的 CKFinder,通过连接器提供所有文件。
  • 您可以使文件夹公开访问,以便所有文件都通过 Web 服务器提供。

如果您依赖 Web 服务器来提供使用 CKFinder 上传的文件,您应该采取额外步骤来确保文件以安全的方式提供。

假设您已配置 CKFinder 允许上传 .avi 文件。

即使 .avi 文件随后使用有效的 Content-Type: video/x-msvideo 标头提供,某些浏览器可能会忽略此信息并对原始文件内容执行其他检查。如果在文件内容中检测到任何类似 HTML 的数据,浏览器可能会决定忽略有关内容类型的信息,并将提供的內容视为普通网页。这种行为被称为 “内容嗅探”(也称为“媒体类型嗅探”或“MIME 嗅探”),在某些情况下,它可能会导致安全问题(例如,它可能会为 跨站点脚本 (XSS) 攻击 打开大门)。

为了避免内容嗅探,您应该确保您的服务器在从公开可用的文件夹提供文件时,将 X-Content-Type-Options: nosniff 标头添加到所有 HTTP 响应中。X-Content-Type-Options 响应 HTTP 标头是服务器使用的标记,表示不应更改 Content-Type 标头设置的 MIME 类型,应予以遵循。因此,浏览器不会对接收到的內容执行任何内容嗅探。

向所有响应添加 X-Content-Type-Options 标头的最简单方法是创建 servlet 过滤器,如以下示例所示。

import jakarta.servlet.*;
import jakarta.servlet.http.HttpServletResponse;
import java.io.IOException;

public class ContentOptionsFilter implements Filter {
    @Override
    public void init(FilterConfig filterConfig) {
    }

    @Override
    public void doFilter(ServletRequest request, ServletResponse response, FilterChain chain) throws IOException, ServletException {
        ((HttpServletResponse) response).setHeader("X-Content-Type-Options", "nosniff");
        chain.doFilter(request, response);
    }

    @Override
    public void destroy() {}
}