【问题标题】:Spring framework: HTTP OPTIONS returning all METHODS (get, put, post, delete, trace, head, options)Spring 框架:返回所有 METHODS 的 HTTP OPTIONS(get、put、post、delete、trace、head、options)
【发布时间】:2023-03-26 23:09:02
【问题描述】:

我编写了一个 Spring Web 应用程序。除了一件事之外,相当稳固。应用程序返回一个 HTTP OPTIONS 请求,响应为“允许:GET、HEAD、POST、PUT、DELETE、OPTIONS”,但事实并非如此,只允许 GET 和 POST。其他操作(GET 和 POST 除外)返回“操作不支持”错误 405 和服务器名称和版本...等。安全团队不喜欢服务器的所有详细信息都返回“不支持”错误消息。

我花了很多时间尝试覆盖该错误页面或为 405 引入自定义错误页面......但我没有成功。 我花了一整天的时间试图禁用 HTTP OPTIONS。没有成功。 还有一个细节,我运行 curl 语句来测试:

curl "http://localhost:8080/webappX/welcome.htm" -X PUT -v

我的应用返回:

HTTP Status 405 - Request method 'PUT' not supported
Tomcat/6.0...etc 

由于这些数据(tomcat 版本、服务器信息和响应元数据)可能被用于安全攻击,我如何创建一个自定义 405 页面来隐藏我的服务器的详细信息并提供非常少的错误页面? 或者我如何禁用 PUT、DELETE、TRACE、OPTIONS、HEAD,这样 Tomcat 可能会忽略它们或不提供有关我的服务器的内部信息。

谢谢

【问题讨论】:

    标签: java spring tomcat servlets spring-security


    【解决方案1】:

    您可以注册并使用Interceptor,它将捕获对应用程序的所有请求,如果方法不是 GET/POST,则只需重定向到您选择的错误页面/发送错误响应。

    public class MyInterceptor extends HandlerInterceptorAdapter{
    
        @Override
        public boolean preHandle(HttpServletRequest request, HttpServletResponse response, Object handler) throws Exception {
    
            if (!request.getMethod().equalsIgnoreCase("POST") && !request.getMethod().equalsIgnoreCase("GET")) {
                // Not a POST/GET - send error and return false
                response.sendError(HttpServletResponse.SC_FORBIDDEN, "Unauthorized Request");
                return false;
            } else {
                return true;
            }
        }
    
    
    }
    

    要注册拦截器,请将其添加到您的 spring xml 配置文件中

    <mvc:interceptors>
    <mvc:interceptor>
        <mvc:mapping path="/**" />
        <bean class="your.package.MyInterceptor" />
    </mvc:interceptor>
    </mvc:interceptors>
    

    【讨论】:

    • 非常感谢!你让我今天很开心。它适用于除 OPTIONS 之外的所有操作。对于选项,我必须将以下 dispatchOptionsRequesttrue 添加到 web.xml 和它像魅力一样工作。你摇滚!!
    • 并且在 myInterceptor.java 而不是提供一些服务器信息的默认 Forbidden 页面中,我刚刚创建了一个 405.htm 页面并将 response.sendredirect() 发送到该页面,如下所示: response.sendRedirect ("405.htm");
    猜你喜欢
    • 2015-01-17
    • 2020-03-03
    • 1970-01-01
    • 2018-05-08
    • 1970-01-01
    • 2014-10-09
    • 2023-04-02
    • 2018-03-07
    • 2023-03-09
    相关资源
    最近更新 更多