如何使用 XML 禁用 Jetty DefaultHandler(以防止目录列表和 webapp 上下文列表)

How to disable the Jetty DefaultHandler using XML (to prevent directory listings and webapp context listings)

我有一个 JETTY_HOME 目录,其中包含已解压的 Jetty 分发包。

我想禁用DefaultHandler,实现三件事:

  1. 防止由 dirAllowed 初始参数控制的目录列表(DefaultServlet 由该参数配置)。

  2. 防止 Web 应用上下文列表,这可能会泄露敏感信息,例如服务器目录路径或同一 Jetty 实例中的其他 Web 应用上下文 运行。

  3. 请确保 DefaultHandler 不会在我搞砸 Web 应用程序部署时提供对任何敏感文件的访问权限。我很高兴在必要时实现我自己的静态文件服务 servlet,作为使用 DefaultHandler.

    的替代方法

我可以简单地编辑 JETTY_HOME/etc/jetty.xml 并从那里删除 DefaultHandler。但是,JETTY_HOME 应该是只读的,我只能在我的 JETTY_BASE 文件夹中进行更改。只修改 JETTY_BASE 的好处是在升级到较新版本的 Jetty 时不必重复修改 JETTY_HOME

如何从内部进行此更改 JETTY_BASE

DefaultHandler是必须的,不要去掉。

让我们解决每个问题。


  1. Prevent directory listings which would otherwise be controlled by the dirAllowed init parameter (the DefaultHandler is configured by this parameter).

DefaultHandler 不做目录列表。 这就是 DefaultServletWebAppContext 中的作用,或者 ResourceService / ResourceHandler 在嵌入式场景中的作用。

如果你想阻止 DefaultServletWebAppContext 中显示目录列表,你需要配置 DefaultServlet.

您可以选择以下选项之一。

  1. 在您的 WEB-INF/web.xml 中声明 <servlet> 条目以配置命名的 servlet defaultdirAllowed 的初始化参数设置为 false.
    这是个别webapp自己的改动WEB-INF/web.xml

  2. 声明一个 servlet 上下文初始参数(不是 servlet 特定的,整个上下文),其中键 org.eclipse.jetty.servlet.Default.dirAllowed 设置为值 false
    这是对每个 webapp 的单个 webapp 自己的 WEB-INF/web.xml 或 XML 可部署(即:${jetty.base}/webapps/<name>.xml)的更改。

  3. 为将默认行为配置为 dirAllowed=false 的 defaultDescriptor 提供备用 webdefault.xml
    这是对单个 webapp XML 可部署设置 WebAppContext.setDefaultDescriptor() 或您正在使用的所选 DeploymentManager / AppProvider 组合的整体可部署默认值的更改。这还需要一个自定义 ${jetty.base}/etc/<name>.xml,这是您的新默认描述符。

  4. 提供覆盖描述符xml,可以在您的 defaultDescriptor + webapp 描述符之后应用以配置 dirAllowed=false。
    这是对单个 webapp XML 可部署设置 WebAppContext.setOverrideDescriptor() 或您正在使用的所选 DeploymentManager / AppProvider 组合的整体可部署默认值的更改。这还需要一个自定义 ${jetty.base}/etc/<name>.xml,这是您的新覆盖描述符。

如果您在嵌入式 Jetty 场景中使用 ResourceService / ResourceHandler,您只需调用 ResourceService.setDirAllowed(false).


  1. Prevent web app context listings, which may reveal sensitive information such as server directory paths or other web app contexts running within the same Jetty instance.

这由 DefaultHandler 上的 showContexts 配置控制。

有两种方法可以控制这种行为。

选项 A: 配置 DefaultHandler

您可以将 2 个文件添加到 ${jetty.base}

新文件:etc/tweak-defaulthandler.xml

<?xml version="1.0"?>
<!DOCTYPE Configure PUBLIC "-//Jetty//Configure//EN" "https://www.eclipse.org/jetty/configure_10_0.dtd">
<Configure id="DefaultHandler" class="org.eclipse.jetty.server.handler.DefaultHandler">
  <Set name="showContexts">false</Set>
</Configure>

${jetty.base}/start.d/tweaks.ini 中添加一行以使用此 XML

$ cat start.d/tweaks.ini 
etc/tweak-defaulthandler.xml

选项 B: 只需声明一个具有 ROOT 默认行为的 ROOT 上下文。

创建一个 ${jetty.base}/webapps/ROOT 目录。 添加一个 ${jetty.base}/webapps/ROOT/index.html 包含您想要的任何内容。 这将代替 DefaultHandler 创建上下文列表。


  1. Be sure that DefaultHandler doesn't provide access to any sensitive files in the event that I botch a web app deployment. I'm happy to implement my own static file serving servlet where necessary as an alternative to using DefaultHandler.

DefaultHandler 只提供 3 样东西。

  1. /favicon.ico 请求(仅当 GET 请求时)
  2. /(显示上下文列表)(仅当 GET 请求且 showContexts 为真时)
  3. 404 错误 - 到达此处理程序的所有其他请求。

你混淆了 DefaultServlet / ResourceService / ResourceHandlerDefaultHandler 完全不同的东西。