首页 > 解决方案 > 如何在 .NET 中使用此类标头或查询参数禁用动词隧道?

问题描述

我的安全扫描失败,说我的 .NET 应用程序允许动词隧道,建议禁用它。应用程序需要接受 PUT 和 DELETE 标头以及 GET 和 POST。

扫描将这些标头发送到接受 POST 的端点:

X-HTTP-METHOD: PUT
X-HTTP-Method-Override: PUT
X-METHOD-OVERRIDE: PUT

我做了很多研究,并且很难找到“禁用”动词隧道的方法。似乎需要允许这些方法,而不是相反。

例如,在 .NET 中,HttpMethodOverrideExtensions 方法允许使用这些类型的标头。我看到了多个关于如何允许上面发布的三个标题的教程。

我的回复是否正确,默认情况下应用程序不允许动词隧道,因为允许它的方法不在应用程序的代码库中?

标签: .nethttpsecurity

解决方案


我只有用 Java 解决这个问题的经验,但我希望我的解决方案有一些对 .NET 的翻译,对你有帮助。您似乎遇到了 Fortify 的 WebInspect 扫描程序报告的“经常被误用:HTTP 方法覆盖”问题。为了为我的团队解决这个问题,我实现了一个过滤器来监听我们的错误标头(x-http-method、x-http-method-override、x-method-override),将状态设置为 405 并在找到它们时中断。请参阅下面的代码。我知道这不是最优雅的解决方案,但它是我发现的唯一一个满足扫描的解决方案(抛出错误并引导用户不满意)。

@Override
public void doFilter(ServletRequest req, ServletResponse res, FilterChain chain) throws IOException, ServletException {
    HttpServletRequest hsReq = (HttpServletRequest) req;
    HttpServletResponse hsRes = (HttpServletResponse) res;

    hsRes.setHeader("Cache-Control", "no-cache, no-store, must-revalidate");
    hsRes.setHeader("Pragma", "no-cache");
    hsRes.setDateHeader("Expires", 0);
    hsRes.setHeader("X-XSS-Protection", "1; mode=block");
    hsRes.addHeader("X-Content-Type-Options", "nosniff");
    hsRes.setHeader("Content-Security-Policy", "frame-ancestors 'none'; default-src *; style-src 'self' http://* 'unsafe-inline'; script-src 'self' http://* 'unsafe-inline' 'unsafe-eval'");
    hsRes.setHeader("X-FRAME-OPTIONS", "DENY");
    hsRes.setHeader("Strict-Transport-Security", "max-age=31536000; includeSubDomains;");

    // This resolves "Often Misused: HTTP Method Override"
    hsRes.setHeader("Access-Control-Allow-Methods", "GET, POST");
    String methodParam = hsReq.getParameter("_method");
    if (methodParam != null){
        LOG.error("\n Bad actor is attempting to use HTTP Method Tunneling. \n");
        hsRes.reset();
        hsRes.setStatus(HttpServletResponse.SC_METHOD_NOT_ALLOWED);
        return;
    }
    String xhmHeader = hsReq.getHeader("x-http-method");
    String xhmoHeader = hsReq.getHeader("x-http-method-override");
    String xmoHeader = hsReq.getHeader("x-method-override");
    if ((xhmHeader != null) || (xhmoHeader != null) || (xmoHeader != null)){
        LOG.error("\n Bad actor is attempting to use HTTP Method Tunneling. \n");
        hsRes.reset();
        hsRes.setStatus(HttpServletResponse.SC_METHOD_NOT_ALLOWED);
        return;
    }

    chain.doFilter(req, res);
}

推荐阅读